【问题标题】:Using two key-pairs in SSL Socket Connection在 SSL 套接字连接中使用两个密钥对
【发布时间】:2012-02-14 16:03:50
【问题描述】:

我想知道如何实现服务器套接字以使其能够识别和使用 根据客户正在使用的证书进行正确的证书以继续 与服务器握手通信。

解释得更好,在服务器端是:

AppServerSideSocket.jar

  • 私钥库:privateKeyApp(JKS 类型,使用 keytool 生成)
  • 公钥库:publicKeyApp(JKS 类型,与所有客户端共享)

在客户端...

AppClientSideSocket.jar - 公共密钥库:publicKeyApp

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

AppClientSideSocket.jar 使用 SSL 与服务器连接,使用 publicKeyApp 验证服务器主机名,并在握手后为 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 和 privateKeyApp 和 publicKeyApp 中 key 的 CN 设置为 goodServer1.com,因为所有客户端都不验证 hostname 或 key 的 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 和 publicKeyAppNew),显然通信发生了 在使用这个新密钥对的服务器和使用这个新公共 publicKeyAppNew 密钥的新客户端之间成功。

但我需要继续为老客户使用旧密钥对。我想知道我该如何处理。

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

或者我需要不同端口的不同 ssl 套接字连接用于哪种客户端?

【问题讨论】:

标签: java sockets ssl-certificate serversocket


【解决方案1】:

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

如果你用谷歌搜索的话,会有很多例子。

Hostname verifier 1 这会创建一个信任所有名称,但您可以根据需要对其进行修改
HttpClient and SSL 与她的答案相同

【讨论】:

  • 丝毫没有解决如何使用两个密钥库和信任库的问题。
  • @EJP:他有密钥库,显然 OP 知道如何使用它们。我确切地回答了如何完成主机名验证,这是 OP 要求的
  • 他问'如何实现服务器套接字......'。 HostnameVerifiers 用于客户端。你的答案仍然无关紧要。
猜你喜欢
  • 2012-02-29
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 2013-09-18
  • 2018-05-04
  • 2013-10-14
  • 2016-08-19
相关资源
最近更新 更多