使用 BKS 和 keytool 导致无法从回复建立链

Posted

技术标签:

【中文标题】使用 BKS 和 keytool 导致无法从回复建立链【英文标题】:Using BKS with keytool resulting in Failed to establish chain from reply 【发布时间】:2016-12-25 04:31:36 【问题描述】:

我正在尝试创建 BKS 密钥库但无法导入证书回复

我收到错误消息 keytool 错误:java.lang.Exception:无法从回复建立链

java.lang.Exception: Failed to establish chain from reply
            at sun.security.tools.KeyTool.establishCertChain(KeyTool.java:3375)
            at sun.security.tools.KeyTool.installReply(KeyTool.java:2583)
            at sun.security.tools.KeyTool.doCommands(KeyTool.java:998)
            at sun.security.tools.KeyTool.run(KeyTool.java:340)
            at sun.security.tools.KeyTool.main(KeyTool.java:333)

BKS 密钥库创建步骤:

第一步:使用openssl创建root ca key和ca cert

openssl req -x509 -newkey rsa:2048 -sha256 -nodes -out cacert.crt -outform PEM -keyout cakey.pem -config openssl-ca.cnf

第2步:将ca cert导入keytool的cacerts keystore作为信任CRT

keytool -importcert -alias root-ca -file cacert.crt -keystore cacerts -storepass changeit

第 3 步:将证书作为信任 CRT 导入 BKS 密钥库

keytool -importcert -storetype BKS -keystore mykeystore.bks -alias root-ca -file cacert.crt -provider org.bouncycastle.jce.provider.BouncyCastleProvider -keypass bks123 -storepass bks123 -providerpath bcprov-ext-jdk15on-154 .jar

第 4 步:生成密钥对

keytool -genkeypair -alias java-client2-key -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -storetype BKS -keystore mykeystore.bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -keypass bks123 -storepass bks123 -providerpath bcprov -ext-jdk15on-154.jar

第 5 步:生成证书请求(CSR)

keytool -certreq -alias java-client2-key -file client2-ugoca.csr -storetype BKS -keystore mykeystore.bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -keypass bks123 -storepass bks123 -providerpath bcprov-ext -jdk15on-154.jar

步骤 6:使用在步骤 1 中创建的自签名根 CA 签署 CSR

openssl x509 -req -days 365 -in client2-ugoca.csr -CA cacert.crt -CAkey cakey.pem -set_serial 300661 -out java-client2.crt

第 7 步:将签名证书导入密钥库

keytool -v -importcert -alias java-client2-key -file java-client2.crt -trustcacerts -storetype BKS -keystore mykeystore.bks -keypass bks123 -storepass bks123 -provider org.bouncycastle.jce.provider.BouncyCastleProvider - providerpath bcprov-ext-jdk15on-154.jar

注意: 能够使用上述步骤创建 java JKS 密钥库

非常感谢任何帮助....!

【问题讨论】:

【参考方案1】:

在Step6之后:我们需要在其中创建带有根CRT的客户端CRT,如下所示

cat java-client2.crt cacert.crt > client_chain.crt

然后在第7步:导入client_chain.crt如下

keytool -v -importcert -alias java-client2-key -file client_chain.crt -trustcacerts -storetype BKS -keystore mykeystore.bks -keypass bks123 -storepass bks123 -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov -ext-jdk15on-154.jar

【讨论】:

以上是关于使用 BKS 和 keytool 导致无法从回复建立链的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致 keytool 错误“无法解密安全内容条目”?

android与服务器的安全连接不起作用

如何从密钥库中导出 .key 和 .crt

使用keytool自建证书及应用

如何使用 keytool 在 PKCS12 密钥库中创建证书?

JKS、BKS 和 PKCS12 文件格式