我正在使用Microsoft Active Directory证书服务(MS ADCS)PKI的环境中工作。在那个环境中,我正在部署this Java app,它使用java密钥库来管理其https服务器的密钥和证书。管理的事实上的工具似乎是keytool.exe
。 keytool
的文档可以在here找到。
通常建议的生成密钥对,创建证书请求和导入证书的方法如下所示:
keytool -genkey -keyalg RSA -keysize 2048 -alias securekey -keystore keystore
keytool -certreq -alias securekey -keystore keystore -file NewCertRequest.csr
keytool -importcert -alias root -keystore keystore -file rootcert.csr
keytool -importcert -alias intermediateX -keystore keystore -file intcert.csr
<=按顺序为每个中间证书重复此操作keytool -importcert -alias securekey -keystore keystore -file NewlySignedCert.csr
第3步建立了trust anchor。 keytool
'打印出'供您审核的证书,并要求您回答“是”以明确信任该证书。
步骤4导入从根链接到新签名证书的信任链中的中间证书。当您导入每个连续的从属中间证书时,keytool
会自动信任它们(或至少它应该信任)。 keytool
表示它具有到信任锚的完整证书路径(即步骤3中的根证书)的方式是微妙且无法记录的:
如果未找到证书且未指定-noprompt选项,则打印出链中最后一个证书的信息,并提示用户验证它。
对此的不成文的推论如下:“如果keytool可以验证信任锚的完整证书路径,它将不会打印出任何证书。”
例如,您可以分别使用GeoTrust Global CA
和Google 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
。
当我尝试使用我的MS ADCS证书(上面描述的谷歌链)构建信任链时,keytool
无法建立信任链。我不确定区别是什么,但是当keytool
在步骤4中打印出证书表明它没有建立信任链直到步骤3中已经受信任的根证书时,就会背叛失败。
鉴于keytool
似乎无法链接MS ADCS证书,我应该如何为我们的环境中使用java密钥库管理密钥和证书的应用程序做些什么呢?
经过多次反复试验,我放弃了keytool
链接MS ADCS证书。最终为我工作的方法是使用Keystore Explorer来获取链接在一起的所有证书的“捆绑”。
还有其他keytool
用户建议通过创建base64编码的X.509证书的串联来导入证书链。我怀疑这种文件格式有正式的官方名称,但我不确定它是什么。基本上,您最终会得到一个如下所示的文本文件:
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
...
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
...
yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
-----END CERTIFICATE-----
...
文件中最底层的证书是根证书,上面是上面链中的第一个从属证书,它是第二个一直到你正在处理的设备的新签名证书。最佳。
所有这些都可以通过使用Windows的内置加密外壳扩展导出证书来导出,以导出base64编码的X.509证书和记事本以连接它们。
我尝试使用keytool
导入捆绑包,如下所示:
keytool -importcert -alias securekey -keystore keystore -file bundle.cer
基于文档keytool
应该对此感到满意,但我收到此错误:
keytool error: java.lang.Exception: Incomplete certificate chain in reply
这并不奇怪。毕竟,这些证书与证书单独导入时keytool
无法建立信任链的证书相同。
使用KeyStore Explorer打开密钥库(即问题和此答案中名为keystore
的文件)。右键单击密钥对并选择Import CA Reply
并将其指向您之前准备的base64编码的X.509证书包。
在我的情况下,至少,KeyStore Explorer成功导入keytool
失败的MS ADCS证书包。导入捆绑包后,我可以继续使用keytool
管理密钥存储区,最终依赖于其https服务器密钥存储区的应用程序成功使用我们的MS ADCS证书。
我遇到了类似的问题(虽然我使用的是VMware Linux版本),并且能够使用以下类似方法解决问题:所需信息: - Putty用于SSH连接到PCNS服务器 - 用于传输的PC客户端文件来回 - 内部Microsoft ADCS - 最后我使用的是APC PCNS 3.1 VMware
•修改文件'/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
问候,
杰米