Java的SSL套接字不工作
我使用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的信任库,我做错了什么?
当我尝试打印出它总是返回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
在这一点上可能意味着很多东西,但有一两件事,这并不意味着是“无法创建套接字连接到端口”。这是客户,做连接:服务器接受连接。当你发现一个异常时,总是打印其消息,不要只是自己编写。
您需要在运行时参数来限定的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包含自己的密钥和证书。
*它们*可以是同一个文件,但它们不应该是相同的文件:它没有任何意义。你只需要定义一个信任库,如果你是服务器*或者*服务器要求客户端认证,这在这里并不令人满意。 – EJP 2012-08-03 12:27:55
的,如果(ServerSocket的!= NULL)可达,它的打印,当我运行程序。我已经修复了IOException异常现在打印它的消息,但那不是我的错误是 – 2012-08-03 06:11:32
这个问题似乎与读取和写入套接字有关。客户端和服务器似乎无法互相传递信息。也许我正在使用的输入和输出流不支持SSL? – 2012-08-03 06:17:10
@MatthewPigram'serverSocket'在程序中的那一点永远不能为空。你已经执行了'serverSocket.accept()'。 – EJP 2012-08-03 06:37:15