【发布时间】:2016-02-29 20:54:02
【问题描述】:
我创建了一个 java JKS 密钥库:
keytool -genkey -alias mydomain -keyalg RSA -keystore mytest.jks -keysize 2048
之后,我使用服务器的 CRT 和 openssl 创建了一个 P12 文件:
openssl pkcs12 -export -in server.crt -inkey server.key > server.p12
现在我将 P12 文件导入到我之前创建的 JKS 密钥库中:
keytool -importkeystore -srckeystore server.p12 -destkeystore mytest.jks -srcstoretype pkcs12
它有效,我可以使用这个 JKS 来初始化与服务器的 SSL 连接:
public static SSLContext initSSLContext(String keystoreLocation, String keystorePwd, String truststorePwd, String serverCrtPwd)
SSLContext context;
context = SSLContext.getInstance("TLS");
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystoreLocation), keystorePwd.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, serverCrtPwd.toCharArray());
KeyStore trustStore = KeyStore.getInstance("jks");
trustStore.load(new FileInputStream(keystoreLocation), truststorePwd.toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
context.init(kmf.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
将导入的 CRT 文件的密钥库位置、密码和密码放在它工作的参数中。
现在我必须将多个 P12 文件转换并导入到同一个 JKS 密钥库中,多次运行导入部分,我有多个使用不同别名导入的密钥,当然还有不同的密码。我的问题是现在每个导入的密钥都有自己的密码。 我只想使用给定密钥库中的每个可用别名初始化 SSL 连接一次。因为更多的服务器会使用 SSL 向我的应用程序发送数据,所以它们有不同的密码,它们被导入到我的密钥库中,但我无法使用多个密码初始化我的密钥库,它只接受一个密码。如何使用多个具有不同别名和不同密码的导入 P12 来初始化我的密钥库? init 方法只接受一个用于“从密钥库恢复密钥”的参数。
谢谢!
【问题讨论】:
-
您必须使用
keytool或 OpenSSL 命令(如果有)将所有密码更改为相同。 -
是否有任何解决方案,如果密码必须不同,因为强安全原因?
-
如果我使用相同的密码将多个密钥导入密钥库,我可以接受来自所有客户端的连接吗?我真正需要的是:一个带有密钥的密钥库(完成),创建一个服务器套接字,它可以接受来自我已经导入的所有客户端的连接(它们在商店中有不同的别名)。可行吗?
标签: java ssl networking