2

我正在使用 TCP/IP 套接字来创建客户端和服务器应用程序。最初我使用的是常规套接字,但现在我决定使用 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,我做错了什么?

4

2 回答 2

1

当我尝试打印出信任库时,它总是返回 null

因为你从来没有设置它。您所做的只是打印出系统属性的值。如果你没有设置它,它是空的。

我究竟做错了什么?

什么都没有,除了打印出无意义的信息。但是你的大部分代码没有意义:

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

serverSocket非空 (a) 在这一点上是不可避免的,并且 (b) 与正在建立的客户端套接字没有任何关系,这在这一点上是不可避免的。

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

IOException这一点上可能意味着很多事情,但它并不意味着“无法创建与端口的套接字连接”。进行连接的是客户端:服务器接受连接。当你捕捉到一个异常时,总是打印它的信息,不要只是自己编造。

于 2012-08-03T05:15:44.270 回答
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 包含自己的密钥和证书。

于 2012-08-03T07:48:19.687 回答