首页 文章

在SSL套接字连接中使用两个密钥对

提问于
浏览
-1

我想知道如何实现服务器套接字,以便能够根据客户端使用的证书来识别和使用正确的证书,以便与服务器进行握手通信 .

在服务器端解释更好的是:

AppServerSideSocket.jar

  • private keystore: privateKeyApp (类型JKS,使用keytool生成)

  • public keystore: publicKeyApp (输入JKS,与所有客户共享)

而在客户端......

AppClientSideSocket.jar - 公钥存储: publicKeyApp

AppServerSideSocket.jar 监听客户端请求并且一旦收到客户端发送的过程信息

AppClientSideSocket.jar 使用SSL使用SSL连接服务器而不使用验证服务器主机名,并在握手后发送AppServerSideSocket应用程序的信息 .

现在,我有另一个客户端应用程序 AppClientSideSocketNEW.jar ,以及此验证服务器主机名,以便与服务器进行通信 . 在这种情况下,客户端公共证书中使用的CN必须与 AppServerSideSocket.jar 所在的主机名匹配 .

原始连接是在服务器端以这种方式配置的:

if (usingSSLConn) {
    System.setProperty("javax.net.ssl.keyStore", "privateKeyApp");
    System.setProperty("javax.net.ssl.keyStorePassword", "privateKeyAppPassword");

    SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    ServerSocket serverSocketApp = sslServerSocketFactory.createServerSocket(Port);

} else
    serverSocketApp = new ServerSocket(Port);
}

所有客户端都收到了相同的publicKeyApp并且没有验证主机名与服务器连接,所以如果服务器上安装服务器套接字应用程序( AppServerSideSocket.jar )的主机名是badServer1.com,而密钥CN是私钥,那么无关紧要 . publicKeyApp使用goodServer1.com进行设置,因为所有客户端都不验证密钥的主机名或CN属性 .

贝娄展示了一种这样的联系:

private static final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {

        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
 };
 System.setProperty("javax.net.ssl.trustStore", publicKey1);
 System.getProperties().setProperty("java.protocol.handler.pkgs", 
            "javax.net.ssl.internal.www.protocol");     
 HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);
 ...
 SOAPConnectionFactory soapConn = SOAPConnectionFactory.newInstance();
 SOAPConnection connection = soapConn.createConnection();
 ...     
 URL endpoint = new URL(hostname + ":" + port);

但是新客户端( AppClientSideSocketNEW.jar )在执行此验证时,现在必须为此客户端提供新证书,其中CN属性的新值反映了服务器套接字所在的正确主机名CN .

我无法访问第二个客户端,我确信它可以进行主机名验证 .

所以我创建了两个新的密钥对证书( privateKeyAppNew and publicKeyAppNew ),并且使用这个新密钥对的服务器和使用这个新的公共publicKeyAppNew密钥的新客户端之间的通信成功了 .

但我需要继续为旧客户使用旧密钥对 . 我想知道如何解决这个问题 .

使用密钥管理器让我能够在客户端尝试连接时验证服务器应用程序上的客户端证书并选择适当的并使用正确的证书进行握手?

或者我需要在不同的端口中为不同类型的客户端提供不同的ssl套接字连接?

1 回答

  • 0

    您需要在要验证服务器证书的CN的连接中设置Hostname Verifier .

    很多例子,如果你google例如

    Hostname verifier 1这会创建一个信任所有名称,但您可以根据需要进行修改
    HttpClient and SSL同样在回答她

相关问题