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

时间:2014-02-22 18:36:57

标签: java active-directory certificate keytool

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

  6. keytool和建立证书链

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

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

      

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

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

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

    keytool无法链接我的Microsoft ADCS证书

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

    怎么做?

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

2 个答案:

答案 0 :(得分:1)

使用KeyStore Explorer

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

准备证书'Bundle'

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

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

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

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

尝试使用keytool导入Bundle失败

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

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

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

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

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

使用“KeyStore Explorer”

将CA回复导入密钥库

使用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

有用的网址: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

•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

此致

杰米

相关问题