我正在使用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 可以验证信任锚的完整证书路径,它将不打印出任何证书。”< / p>
您可以分别使用步骤3和4的GeoTrust Global CA
和Google Internet Authority G2
证书来确认这一点。 (当您转到https://www.google.com时,在绿色锁定后面找到这些证书。)keytool
将打印出根GeoTrust Global CA
并要求您明确信任它。信任GeoTrust Global CA
keytool
后,将导出Google Internet Authority G2
而不打印任何证书,从而表明keytool
信任Google Internet Authority G2
。
当我尝试使用我的MS ADCS证书( a la 上面描述的google链)构建信任链时,keytool
无法建立信任链。我不确定区别是什么,但是当keytool
在步骤4中打印出证书表明它没有建立到已经受信任的根证书的信任链时,就会背叛失败。第3步。
鉴于keytool
似乎无法链接MS ADCS证书,我应该如何为我们的环境中使用java密钥库管理密钥和证书的应用程序做什么?
答案 0 :(得分:1)
经过多次试错,我放弃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证书。
答案 1 :(得分:0)
我遇到了类似的问题(虽然我使用的是VMware Linux版本)并且能够使用以下类似方法解决问题: 需要的信息: - Putty用于与PCNS服务器的SSH连接 - 用于来回传输文件的FTP客户端 - 内部Microsoft ADCS - 最后我使用的是APC PCNS 3.1 VMware
•修改文件'/opt/APC/PowerChute/group1/pcnsconfig.ini' o在[NetworkManagementCard]部分添加KeystorePassword = your_password
行•command:service PowerChute stop
•command:opt / APC / PowerChute / jre1.7.0_45 / bin / keytool -genkey -alias securekey -keyalg RSA -keystore / opt / APC / PowerChute / group1 / keystore -keysize 2048
•command: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服务器(顶部),中间(中间),根(底部)
•command:opt / APC / PowerChute / jre1.7.0_45 / bin / keytool -import -trustcacerts -alias securekey -file /opt/APC/PowerChute/group1/bundle.cer -keystore / opt / APC / PowerChute /组1 /密钥库
•command:service PowerChute start
此致
杰米