2012-03-07 111 views
2

我正在用Java創建一個SSL服務器和客戶端。該節目的重點是模仿電影院節目。我可以建立連接,但是當我試圖「保留」座位時,程序崩潰。我收到以下錯誤:SSL服務器異常:javax.net.ssl.SSLException

服務器異常終止:javax.net.ssl.SSLException:連接已關閉:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路徑生成失敗:sun.security .provider.certpath.SunCertPathBuilderException:無法找到有效的認證路徑要求的目標

這是我的服務器代碼

// SSL Server 
import java.net.*; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import javax.net.ServerSocketFactory; 
import javax.net.ssl.SSLServerSocketFactory; 

public class SSL_Server { 


public static void main(String[] args) { 
    int port = 2018; 

    System.setProperty("javax.net.ssl.keyStore","mySrvKeystore"); 
    System.setProperty("javax.net.ssl.keyStorePassword","123456"); 
    ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault(); 
    ServerSocket ssocket = null; 
    System.out.println("SSL_Server started"); 

    final ExecutorService threadPool = Executors.newCachedThreadPool(); 

    try { 
     ssocket = ssocketFactory.createServerSocket(port); 
     InetAddress myIP =InetAddress.getLocalHost(); 
     System.out.println(myIP.getHostAddress()); 

     while(true){ 
      Socket aClient = ssocket.accept(); 
      //create a new thread for every client 
      threadPool.submit(new SSL_ClientHandler(aClient)); 
     } 

    } 
    catch(Exception e) { 
     System.err.println("Server aborted:" + e); 
    } finally { 
     try{ 
      ssocket.close(); 
     } catch (Exception e){ 
      System.err.println("could not close connection properly" + e); 
     } 
    } 
    System.out.println("connection was closed successfully"); 
} 
} 

以下是我的客戶端代碼

//SSL Client 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.StringTokenizer; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 
import javax.net.ServerSocketFactory; 
import javax.net.SocketFactory; 
import javax.net.ssl.SSLServerSocketFactory; 
import javax.net.ssl.SSLSocketFactory; 

public class TCP_Client { 


public static void main(String[] args) throws IOException{ 
// SSL_Client newClient = new SSL_Client(); 
// Lock lock = new ReentrantLock(); 
    boolean validInput = false; 

    BufferedReader din; 
    PrintStream pout; 

    int port = 2018; 
    BufferedReader stdinp = new BufferedReader(new InputStreamReader(System.in)); 
    String line = "done"; 
    StringTokenizer st; 
    String hostname; 
    String task = "done"; 


    if(args.length>0) 
     hostname = args[0]; 
    else 
     hostname = "localhost"; 

    SocketFactory socketFactory = SSLSocketFactory.getDefault(); 
    //Socket socket = socketFactory.createSocket(hostname, port); 

    while(true) 
    { 
     try{ 
      //read input 
      while(!validInput) 
      { 
       System.out.println("Please enter a valid command or 'done' to finish."); 
       line = stdinp.readLine(); 
       st = new StringTokenizer(line); 
       task = st.nextToken(); 
       if(task.equals("reserve") || task.equals("search") || task.equals("delete") || task.equals("getinfo") || task.equals("done")) 
       { 
        validInput =true; 
        break; 
       } 
       System.out.println("Invalid command. Please enter another command or 'done' to escape."); 
      } 
      if(task.equals("done")) 
      { 
       break; 
      } 
      validInput = false;//reset for next line read in 

      //create a new socket every time 
      //Socket socket = new Socket(hostname, port); 

      Socket socket = socketFactory.createSocket(hostname, port); 
      din = new BufferedReader (new InputStreamReader (socket.getInputStream())); 
      pout = new PrintStream (socket.getOutputStream()); 

      pout.println(line); 
      pout.flush(); 

      //print out response from server 
      System.out.println(din.readLine()); 

     } catch (Exception e){ 
      System.err.println("Server aborted: " + e); 
     } 
    } 
} 
} 

回答

3

「無法找到所請求的目標的有效證書路徑」表示您的信任庫不信任服務器證書。將其導入您的信任庫,或由認可的CA簽署。

+0

你能幫助我創建和導入證書嗎?我不認爲我做對了。 – 2012-03-07 23:49:36

+1

只需按照「JSSE參考指南」中的說明進行操作即可。 – EJP 2012-03-08 00:16:27