当keytool.exe无法从我的证书中建立证书链时,我该怎么办?

问题描述 投票:0回答:2

我正在使用Microsoft Active Directory证书服务(MS ADCS)PKI的环境中工作。在那个环境中,我正在部署this Java app,它使用java密钥库来管理其https服务器的密钥和证书。管理的事实上的工具似乎是keytool.exekeytool的文档可以在here找到。

通常建议的生成密钥对,创建证书请求和导入证书的方法如下所示:

  1. 生成密钥对keytool -genkey -keyalg RSA -keysize 2048 -alias securekey -keystore keystore
  2. 生成证书申请keytool -certreq -alias securekey -keystore keystore -file NewCertRequest.csr
  3. 导入根证书keytool -importcert -alias root -keystore keystore -file rootcert.csr
  4. 导入中间证书keytool -importcert -alias intermediateX -keystore keystore -file intcert.csr <=按顺序为每个中间证书重复此操作
  5. 导入新签名证书keytool -importcert -alias securekey -keystore keystore -file NewlySignedCert.csr

keytool and Establishing a Certificate Chain

第3步建立了trust anchorkeytool'打印出'供您审核的证书,并要求您回答“是”以明确信任该证书。

步骤4导入从根链接到新签名证书的信任链中的中间证书。当您导入每个连续的从属中间证书时,keytool会自动信任它们(或至少它应该信任)。 keytool表示它具有到信任锚的完整证书路径(即步骤3中的根证书)的方式是微妙且无法记录的:

如果未找到证书且未指定-noprompt选项,则打印出链中最后一个证书的信息,并提示用户验证它。

对此的不成文的推论如下:“如果keytool可以验证信任锚的完整证书路径,它将不会打印出任何证书。”

例如,您可以分别使用GeoTrust Global CAGoogle Internet Authority G2证书来确认步骤3和4。 (当你去https://www.google.com时,在绿色锁定背后找到这些证书。)keytool将打印出根GeoTrust Global CA并要求你明确信任它。在信任GeoTrust Global CA之后keytool将导入Google Internet Authority G2而不打印任何证书,从而表明keytool信任Google Internet Authority G2

keytool can't chain my Microsoft ADCS certs

当我尝试使用我的MS ADCS证书(上面描述的谷歌链)构建信任链时,keytool无法建立信任链。我不确定区别是什么,但是当keytool在步骤4中打印出证书表明它没有建立信任链直到步骤3中已经受信任的根证书时,就会背叛失败。

What to do?

鉴于keytool似乎无法链接MS ADCS证书,我应该如何为我们的环境中使用java密钥库管理密钥和证书的应用程序做些什么呢?

java active-directory certificate keytool
2个回答
1
投票

使用KeyStore Explorer

经过多次反复试验,我放弃了keytool链接MS ADCS证书。最终为我工作的方法是使用Keystore Explorer来获取链接在一起的所有证书的“捆绑”。

Prepare the Certificate 'Bundle'

还有其他keytool用户建议通过创建base64编码的X.509证书的串联来导入证书链。我怀疑这种文件格式有正式的官方名称,但我不确定它是什么。基本上,您最终会得到一个如下所示的文本文件:

-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
...
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
...
yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
-----END CERTIFICATE-----
...

文件中最底层的证书是根证书,上面是上面链中的第一个从属证书,它是第二个一直到你正在处理的设备的新签名证书。最佳。

所有这些都可以通过使用Windows的内置加密外壳扩展导出证书来导出,以导出base64编码的X.509证书和记事本以连接它们。

Trying to Import the Bundle Using keytool fails

我尝试使用keytool导入捆绑包,如下所示:

keytool -importcert -alias securekey -keystore keystore -file bundle.cer

基于文档keytool应该对此感到满意,但我收到此错误:

keytool error: java.lang.Exception: Incomplete certificate chain in reply

这并不奇怪。毕竟,这些证书与证书单独导入时keytool无法建立信任链的证书相同。

Import CA Reply into Keystore Using "KeyStore Explorer"

使用KeyStore Explorer打开密钥库(即问题和此答案中名为keystore的文件)。右键单击密钥对并选择Import CA Reply并将其指向您之前准备的base64编码的X.509证书包。

在我的情况下,至少,KeyStore Explorer成功导入keytool失败的MS ADCS证书包。导入捆绑包后,我可以继续使用keytool管理密钥存储区,最终依赖于其https服务器密钥存储区的应用程序成功使用我们的MS ADCS证书。


0
投票

我遇到了类似的问题(虽然我使用的是VMware Linux版本),并且能够使用以下类似方法解决问题:所需信息: - Putty用于SSH连接到PCNS服务器 - 用于传输的PC客户端文件来回 - 内部Microsoft ADCS - 最后我使用的是APC PCNS 3.1 VMware

有用的网址:http://www2.schneider-electric.com/resources/sites/SCHNEIDER_ELECTRIC/content/live/FAQS/176000/FA176886/en_US/Replacing%20the%20SelfSigned%20Cert%20on%20PowerChute_Linux.pdf

•修改文件'/opt/APC/PowerChute/group1/pcnsconfig.ini'o在[NetworkManagementCard]部分添加KeystorePassword = your_password行

•命令:service PowerChute停止

•命令:opt / APC / PowerChute / jre1.7.0_45 / bin / keytool -genkey -alias securekey -keyalg RSA -keystore / opt / APC / PowerChute / group1 / keystore -keysize 2048

•命令:opt / APC / PowerChute / jre1.7.0_45 / bin / keytool -certreq -alias securekey -keystore / opt / APC / PowerChute / group1 / keystore -file /opt/APC/PowerChute/group1/newpowerchute.csr

•将证书链(* .cer)组合成1个捆绑文件(bundle.cer):Web服务器(顶部),中间(中间),根(底部)

•命令:opt / APC / PowerChute / jre1.7.0_45 / bin / keytool -import -trustcacerts -alias securekey -file /opt/APC/PowerChute/group1/bundle.cer -keystore / opt / APC / PowerChute / group1 / keystore

•command:service PowerChute start

问候,

杰米

© www.soinside.com 2019 - 2024. All rights reserved.