动态 SSL Keystore/Certificate 选择
Dynamic SSL Keystore/Certificate selection
我的应用程序是一个 Web 服务提供者 运行 在 websphere 上,SOAP Web 服务客户端由几个特定于每个客户端的密钥库组成。该应用程序需要迁移到 tomcat,我很震惊,因为我需要使用不同的证书根据传入的客户端请求与后端服务器建立 TLS 连接
我正在使用 springboot 并且可以配置密钥库和信任库。遵循以下 link:
http://zoltanaltfatter.com/2016/04/30/soap-over-https-with-client-certificate-authentication/
我想根据客户端在运行时间设置certificate/keystore。为此,我连接了密钥库和配置(客户端)名称,以便我可以动态使用客户端特定的密钥库。但这是紧耦合的东西,每次我有一个新的客户端,我需要为客户端创建一个条目并设置相应的密钥库。
但我想到了另一种方法,比如我将所有证书保存在一个密钥库中,我们如何才能动态访问客户端特定的证书?
您可以使用密钥库来管理您所有的客户端证书,这些证书将由别名标识。
默认 KeyManager
将 select 握手中的第一个证书,因此在创建连接之前无需构建您自己的 X509KeyManager
来指定要使用的别名。参见 How I can tell alias of the wanted key-entry to SSLSocket before connecting?
KeyStore keystore = ... //The keystore with all your certificates
//The keymanager for an specific connection
KeyManagerFactory kmf= KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keystore, password.toCharArray());
//Create a keyManager wrapper that returns the alias to use
final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
X509KeyManager km = new X509KeyManager() {
public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
return "alias";
}
public X509Certificate[] getCertificateChain(String alias) {
return origKm.getCertificateChain(alias);
}
// override the rest of the methods delegating to origKm ...
}
在 HttpsUrlConnectionMessageSender
中注入新的 keyManager
HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
//messageSender.setKeyManagers(keyManagerFactory.getKeyManagers());
messageSender.setKeyManagers(new KeyManager[] { km });
我的应用程序是一个 Web 服务提供者 运行 在 websphere 上,SOAP Web 服务客户端由几个特定于每个客户端的密钥库组成。该应用程序需要迁移到 tomcat,我很震惊,因为我需要使用不同的证书根据传入的客户端请求与后端服务器建立 TLS 连接
我正在使用 springboot 并且可以配置密钥库和信任库。遵循以下 link:
http://zoltanaltfatter.com/2016/04/30/soap-over-https-with-client-certificate-authentication/
我想根据客户端在运行时间设置certificate/keystore。为此,我连接了密钥库和配置(客户端)名称,以便我可以动态使用客户端特定的密钥库。但这是紧耦合的东西,每次我有一个新的客户端,我需要为客户端创建一个条目并设置相应的密钥库。
但我想到了另一种方法,比如我将所有证书保存在一个密钥库中,我们如何才能动态访问客户端特定的证书?
您可以使用密钥库来管理您所有的客户端证书,这些证书将由别名标识。
默认 KeyManager
将 select 握手中的第一个证书,因此在创建连接之前无需构建您自己的 X509KeyManager
来指定要使用的别名。参见 How I can tell alias of the wanted key-entry to SSLSocket before connecting?
KeyStore keystore = ... //The keystore with all your certificates
//The keymanager for an specific connection
KeyManagerFactory kmf= KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keystore, password.toCharArray());
//Create a keyManager wrapper that returns the alias to use
final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
X509KeyManager km = new X509KeyManager() {
public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
return "alias";
}
public X509Certificate[] getCertificateChain(String alias) {
return origKm.getCertificateChain(alias);
}
// override the rest of the methods delegating to origKm ...
}
在 HttpsUrlConnectionMessageSender
keyManager
HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
//messageSender.setKeyManagers(keyManagerFactory.getKeyManagers());
messageSender.setKeyManagers(new KeyManager[] { km });