2012-08-03 45 views
2

我使用TCP/IP套接字来创建一个客户端和服务器的一个应用。最初我使用普通套接字,但现在我决定使用SSL进行连接。我创建了一个密钥库,并尝试运行我的应用程序,但它尚未成功。Java的SSL套接字不工作

这里是我的服务器

public class ArFileServer { 

public static void main(String[] args) 
{ 
    boolean listening = true; 
    ServerSocketFactory serversocketfactory; 
    ServerSocket serverSocket; 

    try 
    { 
     //serverSocket = new ServerSocket(4445); 

     serversocketfactory = SSLServerSocketFactory.getDefault(); 
     serverSocket = serversocketfactory.createServerSocket(4445); 

     String keystore = System.getProperty("javax.net.ssl.trustStore"); 
     System.out.println(keystore); 

     // infinite loop to continually listen for connection requests made by clients 
     while (listening) 
     { 
      new ClientConnection(serverSocket.accept()).start(); 

      if (serverSocket != null) 
      { 
       System.out.println("Connection to client established"); 
      } 
     } 

     serverSocket.close(); 
    } 
    catch (IOException e) 
    { 
     System.out.println("Error could not create socket connection to port, check that port is not busy"); 
    } 
} 
} 

代码,这里是客户端代码:

public class ClientSocket 
{ 
SocketFactory socketfactory = null; 
Socket clientSocket = null; 
PrintWriter out = null; 
BufferedReader in = null; 


// establish a connection to All Care's server application through socket 4444 (adjust localhost to reflect the IP address that the server 
// is being run from) 
public ClientSocket() 
{ 
    try 
    { 
     //clientSocket = new Socket("localhost", 4445); 

     //SocketFactory socketfactory = SSLSocketFactory.getDefault(); 
     clientSocket = socketfactory.createSocket("192.168.1.8", 4445); 
     out = new PrintWriter(clientSocket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     String truststore = System.getProperty("javax.net.ssl.trustStore"); 
     System.out.println(truststore); 
    } 
    catch (IOException e) 
    { 
     System.out.println("Could not connect to All Care Server Application : " + e.getMessage()); 
    } 
} 
} 

我还利用这些运行参数:

-Djavax.net.ssl.keyStore=C:\Users\Chris\Documents\NetBeansProjects\ArFile\keystore.jks -Djavax.net.ssl.keyStorePassword=password 

当我尝试打印出它总是返回null的信任库,我做错了什么?

回答

1

当我尝试打印出它总是返回null

因为你永远不会把它的信任。您所做的只是打印出系统属性的值。如果你没有设置它,它是空的。

我究竟做错了什么?

算不了什么,除了打印出无意义的信息。但很多你的代码没有意义:

if (serverSocket != null) 
{ 
    System.out.println("Connection to client established"); 
} 

serverSocket被非空(一)在这一点上不可避免的,和(b)没有任何做客户端套接字正在建立,这在这一点上是不可避免的。

catch (IOException e) 
{ 
    System.out.println("Error could not create socket connection to port, check that port is not busy"); 
} 

IOException在这一点上可能意味着很多东西,但有一两件事,这并不意味着是“无法创建套接字连接到端口”。这是客户,做连接:服务器接受连接。当你发现一个异常时,总是打印消息,不要只是自己编写。

+0

的,如果(ServerSocket的!= NULL)可达,它的打印,当我运行程序。我已经修复了IOException异常现在打印它的消息,但那不是我的错误是 – 2012-08-03 06:11:32

+0

这个问题似乎与读取和写入套接字有关。客户端和服务器似乎无法互相传递信息。也许我正在使用的输入和输出流不支持SSL? – 2012-08-03 06:17:10

+0

@MatthewPigram'serverSocket'在程序中的那一点永远不能为空。你已经执行了'serverSocket.accept()'。 – EJP 2012-08-03 06:37:15

0

您需要在运行时参数来限定的trustStore用于keyStore:

-Djavax.net.ssl.keyStore=xxx.ks 
-Djavax.net.ssl.keyStorePassword=yyy 
-Djavax.net.ssl.trustStore=xxx.ks 
-Djavax.net.ssl.trustStorePassword=yyy 

既可以是同一个文件。

的trustStore包含其他的公钥。 keyStore包含自己的密钥和证书。

+0

*它们*可以是同一个文件,但它们不应该是相同的文件:它没有任何意义。你只需要定义一个信任库,如果你是服务器*或者*服务器要求客户端认证,这在这里并不令人满意。 – EJP 2012-08-03 12:27:55