2012-02-14 69 views
-1

我想知道如何实现服务器套接字以使其能够识别并使用 根据客户端正在使用的证书进行的正确证书进行 握手通信服务器。在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套接字连接?

+0

在一个[使用两个私钥(密钥库)和两个公共密钥(信任)的可能重复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

+0

...本身[在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

回答

0

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

大量的例子,如果你谷歌例如

Hostname verifier 1这将创建一个信任所有的名字,但你需要
HttpClient and SSL相同的答案,你可以修改它,她

+0

没有解决如何在最轻微的情况下使用两个keystore和truststore的问题。 – EJP 2012-02-15 01:29:09

+0

@EJP:他有密钥库,显然OP知道使用它们很热。我准确地回答了主机名验证是如何完成的,这是OP要求的 – Cratylus 2012-02-15 16:26:01

+1

他问'如何实现服务器套接字...'。 HostnameVerifiers是为客户端。你的答案仍然无关紧要。 – EJP 2012-02-16 09:08:19