相互SSL - 拿到钥匙/在适当的格式信任库
我生成使用OpenSSL一个CSR:相互SSL - 拿到钥匙/在适当的格式信任库
openssl req -out MyCompanyCsr.csr -new -newkey rsa:2048 -nodes -keyout MyCompanyPrivateKey.key
所以开始的时候,我们有:
- MyCompanyPrivateKey.key
- MyCompanyCsr.csr
然后,我把它交给我们的集成伙伴,谁回应了3个文件:
- PartnerIntermediateCa.crt
- PartnerRootCa.crt
- MyCompanyCsr.crt
现在我需要使用相互SSL连接到他们的Web服务。为此,我知道我需要在JAXB的SSLSocketFactory中设置truststore和keystore。
我使用实例化Java中的密钥库和信任:
KeyStore trustStore = KeyStore.getInstance("JKS");
InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath);
trustStore.load(tsis, "mypassword".toCharArray());
tsis.close();
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath);
keyStore.load(ksis, "mypassword".toCharArray());
if (ksis != null) {
ksis.close();
}
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "mypassword".toCharArray());
但是,试图在连接到服务器使用此代码抛出与消息http.client.failed
一个SSLHandshakeException
:
com.sun.xml.ws.client.ClientTransportException: HTTP transport error:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
我使用的keystore
和truststore
从我的浏览器导出,客户端私钥为PKCS
,服务器证书为x509 Cert PKCS#7 w/ Chain'. Then opened them up in Portecle and exported them both as
JKS` fi LES。
假设Java代码是合法的,我怎么能确定我已经正确创建了keystore
和truststore
?
非常感谢。
我终于明白了这一点。我使用了FireFox和Portecle。
在浏览器中安装服务器证书和私钥。
注:人们总是混淆一点:无论是“信任”和“密钥库”是密钥库尽可能Portecle/Java的云。唯一的区别是我们使用的我们的密钥库在客户端将会拥有除公共证书之外的私钥。
信任库与服务器证书建:
- 转到在地址的网址,点击旁边的地址栏(锁图标,显示已启用SSL)
- 安全选项卡>查看证书>详细信息选项卡>导出按钮
- 选择类型:X.509带链(PKCS#7)的证书。
另存为地方ffTestServerCert.crt
通过
公开赛在Portecle:检查菜单>检查证书>选择ffTestServerCert.crt
- 现在,您可以看到包含在此的证书(我看到3实例) 。每个需要自行导出。点击箭头按钮,在页面顶部和每个:
- 点击“PEM编码”按钮
- 保存按钮
保存的.pem文件在磁盘(在这个例子中,说我有caCert1.pem,caCert2。 PEM,caCert3.pem)
创建Portecle新的密钥库:文件>新建密钥库> JKS
- 对于从上面每个导出证书(caCert1.pem,caCert2.pem,caCert3.pem),这样做:
- 工具>导入可信证书>选择.pem> Imp ort按钮
- 消息框弹出,说我们需要确定我们是否信任此证书。
- 单击确定>确定(如果你信任的证书)>是>输入别名(我离开它在默认情况下)>确定
重复你要导入任何其他证书(我做了所有3)。
保存密钥存储在Portecle:
- 文件>保存密钥存储为...>
- 输入信任密码两次
- 输入名称将其保存为,如clientTrustStore.jks
恭喜,这是有效的信任库。
密钥库使用私钥和服务器证书建:
- 先导入私钥到Firefox(或Chrome或IE)
- 使用浏览器导出PKCS格式的私钥。
- 的Firefox>首选项>高级选项卡>加密选项卡>查看证书>您的证书
- 选择要导出一个>单击备份按钮
- (唯一的选择这里PKCS12格式,这是我们所希望的)
- 选择一个名称 - clientKeys.p12
- 为密钥库
应该说,他们分别出口输入密码,点击确定
在Portecle中打开密钥
- 文件>打开密钥库>选择clientKeys。P12我们保存上述
输入密码选择上述
转换使用Portecle
- 工具>更改仓库类型> JKS
- 阅读关于如何在当前类型不支持关键的警告消息JKS - 对输入密码
-
重要提示:此操作将设置为密钥对条目
password
的密码。 - 要更改内部密钥对条目的密码,请在Portecle中的文件中选择任何“密钥对”(它们的图标将是一对密钥,在另一个上面)
- 右键单击'密钥对进入”>设置密码
- 输入旧密码(这就是‘密码’),然后输入新的密码,你想
点击OK
保存密钥库什么:
- 在门CLE做:文件>另存为密钥存储库>输入名称,如clientKeyStore.jks
- 点击保存
成品
现在你有正确的配置clientTrustStore.jks和clientKeyStore.jks用于验证您的客户端。
要查看如何使用这些的示例,可以查看: SOAP with mutual SSL - how to send over credentials?