java - 在 SSL 套接字工厂连接中使用多个 key 对

标签 java security ssl ssl-certificate

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

所以我将能够共享不同的公钥并进行握手
动态地基于公钥存储为客户提供

下面是解释我如何创建此连接 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");
...

这是可能的还是梦想?

谢谢

最佳答案

您可以通过使用您自己的 X509KeyManager 构建您自己的 SSLContext 并使用其 chooseClientAlias 选择 keystore 别名 来实现此目的方法(或 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();

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

您实际上不必委托(delegate)给原始的 KeyManager(我只是觉得它更方便)。您可以很好地实现其所有方法以使用您加载的 KeyStore 返回 key 和证书

请注意,这对于选择客户端证书非常有用。 Java 不支持服务器端的服务器名称指示 (SNI)(据我所知,即使在 Java 7 中也是如此),因此在选择别名(来自服务器的观点)。

关于java - 在 SSL 套接字工厂连接中使用多个 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179717/

相关文章:

java - 无法设置互联网连接的广播接收器,如下是我的代码

java - Intellij : Running a program fails, 返回一个完全独立的程序中包含的错误

java - 带有 MVC 的 Spring 3 JSON

iphone - 如何使iPhoneHTTPServer安全服务器

java - 测试手动停止后如何执行逻辑?

security - 防止 Azure 服务总线的伪造和消息签名

java - 如何在 WAS v8.0 联合存储库的 LDAP 存储库中添加和查看其他 AD LDAP 属性?

ssl - 在 bitbucket 放弃对 TLS 1.0/1.1 的支持后,Jenkins 构建失败

ssl - "bq"命令行工具抛出 CERTIFICATE_VERIFY_FAILED

java - 我如何告诉 NEXUS 使用自定义信任库