【发布时间】: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 套接字连接用于哪种客户端?
【问题讨论】:
-
... 本身就是 Using more than one key-pair in SSL Socket Factory Connection 的副本。三个都是同一个人问的……
标签: java sockets ssl-certificate serversocket