gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:22:16 26 4
gpt4 key购买 nike

我所在的环境具有有效的 Microsoft Active Directory 证书服务 (MS ADCS) PKI。在该环境中,我正在部署 this Java app它使用 java key 存储来管理其 https 服务器的 key 和证书。 事实上的管理工具似乎是keytool.exe。可以找到 keytool 的文档 here .

通常推荐的生成 key 对、创建证书请求和导入证书的方法如下:

  1. 生成 key 对 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 middleX -keystore keystore -file intcert.csr <= 对每个中间证书重复此操作,订单

  5. 导入新签名的证书 keytool -importcert -alias securekey -keystore keystore -file NewlySignedCert.csr

keytool 和建立证书链

第 3 步建立 trust anchorkeytool“打印”证书供您查看,并要求您回答"is"以明确信任该证书。

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

If the certificate is not found and -noprompt option is not specified, the information of the last certificate in the chain is printed out, and the user is prompted to verify it.

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

您可以通过分别使用第 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 互联网管理局 G2

keytool 无法链接我的 Microsoft ADCS 证书

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

做什么?

鉴于 keytool 似乎无法链接 MS ADCS 证书,对于我们环境中使用 java key 存储来管理 key 和证书的应用程序,我应该怎么做?

最佳答案

使用 keystore 资源管理器

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

准备证书“ 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

使用 KeyStore Explorer 打开 keystore (即问题和此答案中名为 keystore 的文件)。右键单击 key 对并选择导入 CA 回复,并将其指向您之前准备的 Base64 编码 X.509 证书包。

至少就我而言,KeyStore Explorer 成功导入了 keytool 失败的 MS ADCS 证书包。导入 bundle 后,我可以继续使用 keytool 管理 key 存储,最终依赖于其 https 服务器的 key 存储的应用程序成功使用我们的 MS ADCS 证书。

关于java - 当 keytool.exe 无法从我的证书建立证书链时,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21958654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com