我想知道如何实现服务器套接字以使其能够识别并使用 根据客户端正在使用的证书进行的正确证书进行 握手通信服务器。在SSL套接字连接中使用两个密钥对
解释更好,在服务器侧是:
AppServerSideSocket.jar
- 专用密钥存储器:privateKeyApp(JKS类型,与密钥工具生成)
- 公共密钥库:publicKeyApp(JKS型,与所有客户共享)
而且在客户端...
AppClientSideSocket.jar - 公共密钥库:publicKeyApp
的AppServerSideSocket.jar监听客户端的请求,并通过客户端发送一次接到proocess 信息
AppClientSideSocket.jar使用SSL使用SSL连接服务器publicKeyAppwithout 验证服务器主机名握手后发送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中的密钥的CN设置为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)务请核实这obrigatorily,现在有必要提供一个新的证书 此客户端CN属性的新值反映了服务器套接字所在的正确主机名CN。
我没有访问第二个客户端,我确信它进行主机名验证。
所以我创建了两个新的密钥对ceritificates(privateKeyAppNew和publicKeyAppNew)和aparently通信发生 使用使用这种新的公共publicKeyAppNew键这个新的密钥对和新的客户端服务器之间成功。
但我需要继续为旧客户端使用旧的密钥对。我想知道我该如何处理这个问题。
当客户端尝试连接时,使用keymanager让我能够验证服务器应用程序上的客户端证书,并且 选择适当并使用正确的证书进行握手?
或者我需要不同的端口为不同类型的客户端不同的ssl套接字连接?
在一个[使用两个私钥(密钥库)和两个公共密钥(信任)的可能重复SSL Socket Connection](http://stackoverflow.com/questions/9215667/using-two-private-keys-keystore-and-two-public-keys-truststore-in-one-ssl-so) – Bruno 2012-02-14 18:39:08
...本身[在SSL Socket Factory连接中使用多个密钥对]的副本(http://stackoverflow.com/questions/9179717/using-more-than-one-key-pair-in-ssl-socket-factory-连接)。所有3个人都被同一个人问过...... – Bruno 2012-02-14 18:40:05