在SSL套接字工厂连接中使用多个密钥对

时间:2012-02-07 16:15:37

标签: java security ssl ssl-certificate

我正在使用密钥对,并且我在考虑使用多个私钥创建ans SSL套接字工厂的可能性。

因此,我可以分享不同的公钥并进行握手 动态地基于公钥存储为客户提供

Bellow是解释我如何创建此连接SSL的源代码

...
  ...log("Activating an SSL connection");
  System.setProperty("javax.net.ssl.keyStore", "myPrivateKey");
  System.setProperty("javax.net.ssl.keyStorePassword", "myPass");

  // SSL Server Socket Factory
  SSLServerSocketFactory sslSrvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
  objServerSocket = sslSrvFact.createServerSocket(iPort);
  log("SSL connection actived");
...

它可能还是梦想?

THX

1 个答案:

答案 0 :(得分:3)

您可以使用自己的SSLContext构建自己的X509KeyManager,并使用chooseClientAlias方法(或alias取决于chooseServerAlias,取决于// Load the key store: change store type if needed KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream fis = new FileInputStream("/path/to/keystore"); try { ks.load(fis, keystorePassword); } finally { if (fis != null) { fis.close(); } } // Get the default Key Manager KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, keyPassword); final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0]; X509KeyManager km = new X509KeyManager() { public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { // Implement your alias selection, possibly based on the socket // and the remote IP address, for example. } // Delegate the other methods to origKm. } SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(new KeyManager[] { km }, null, null); SSLSocketFactory sslSocketFactory = sslContext.getSSLSocketFactory(); 在旁边)。

这些方面应该有效:

{{1}}

(有short example here可以帮助您入门。)

您实际上不必委托给原始KeyManager(我发现它更方便)。您可以使用已加载的KeyStore

实现其所有方法以返回密钥和证书

请注意,这对于选择客户端证书非常有用。 Java不支持服务器端的服务器名称指示(SNI)(据我所知,甚至在Java 7中),因此在选择别名之前,您将无法知道客户端请求的主机名(来自服务器的观点)。