当前位置: 首页 > 知识库问答 >
问题:

使用keytool时我该怎么做。exe无法从我的证书建立证书链?

公西兴业
2023-03-14

我在一个使用Microsoft Active Directory证书服务(MS ADCS)PKI的环境中工作。在这种环境下,我将部署这个Java应用程序,它使用Java密钥存储来管理https服务器的密钥和证书。实际上的管理工具似乎是keytool。exekeytool的文档可以在这里找到。

生成密钥对、创建证书请求和导入证书的一般推荐方法如下:

>

生成证书请求keytool-certreq-alias securekey-keystore keystore-file NewCertRequest。企业社会责任

导入根证书keytool-importcert-alias Root-keystore-keystore-file rootcert。企业社会责任

导入中间证书keytool-importcert-alias mediatex-keystore-keystore-file intcert。企业社会责任

导入新签署的证书keytool-importcert-alias securekey-keystore keystore-file NewlySignedCert。企业社会责任

第3步建立信任锚。keyool打印出证书供您检查,并要求您回答"yes"以显式信任该证书。

步骤4导入信任链中的中间证书,这些证书从根目录链接到新签名的证书。导入每个连续的下级中间证书时,keytool会自动信任它们(或者至少应该信任它们)。keytool表示它有一个到信任锚点的完整证书路径(即步骤3中的根证书)的方式很微妙,而且记录得很弱:

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

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

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

当我试图使用我的MS ADCS证书(如上所述的谷歌链)构建信任链时,keyool无法建立信任链。我不确定确切地说,区别是什么,但是当keyool在步骤4中打印出证书,表明它没有从步骤3建立到已经受信任的根证书的信任链时,失败就被暴露了。

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

共有3个答案

尉迟京
2023-03-14

PCNS Windows用户注意:

要求:将有效的第三方证书安装到PCNS web服务器(TCP:6547)

PKI方案:根CA-

PCNS安全手册中的“附录:替换默认的PowerSleet SSL证书”章节。pdf表示我们需要遵循以下步骤:

  1. 为Java密钥库文件“C:\Program Files\APC\PowerSleet\group1\keystore”配置密码[GOOD]
  2. 删除现有密钥库文件“C:\Program Files\APC\PowerSleet\group1\keystore”[STANGE/GOOD]
  3. 为密钥库文件“C:\Program Files\APC\PowerSleet\group1\keystore”生成新的RSA密钥[GOOD]
  4. 为密钥库文件“C:\Program Files\APC\PowerSleet\group1\keystore”[不完美/良好]
  5. 使用openssl使用自签名CA对CSR进行签名[NOT PERFECT]
  6. 将根CA导入密钥库文件“C:\Program Files\APC\PowerSleet\group1\PowerShute密钥库”[奇怪/导致错误]
  7. 将根CA签署的证书导入密钥库文件“C:\Program Files\APC\PowerSleet\group1\PowerShute keystore”[奇怪/导致错误]

在遵循官方定义的过程后,我未能将企业CA签名证书安装到PCNS网络服务器。我甚至不能理解为什么我们需要使用"PowerChut-keystore"文件的证书导入过程,如果我们在"keystore"文件中生成RSA密钥

我创建了以下在我的环境中工作的过程。所有命令都是在PowerShell中以提升的权限执行的,因为keytool。exe需要管理员权限才能从密钥库文件中删除条目。我使用了微软的外部OpenJDK,它安装了JAVA_HOME环境变量。示例密钥库密码设置为changeme123,但最好使用另一个。企业CA配置了自动批准有效证书请求。使用GPO将企业CA和根CA证书添加到所有域客户端上的信任存储中

# Java keystore password
$jksPwd = 'changeme123'

# Current host DNS name (hostname)
$hostNameShort = $env:COMPUTERNAME.ToLower()

# Current host DNS name (FQDN)
$hostNameLong = $env:COMPUTERNAME.ToLower() + '.' + $env:USERDNSDOMAIN.ToLower()

# Current host IP address
$hostIp = (Get-NetIPAddress -AddressFamily IPV4 -InterfaceAlias 'Ethernet0').IPAddress

# Enterprise PKI template name (web server)
$pkiTpl = 'WebServer'

# Enterprise PKI server FQDN
$pkiHost = 'entpki.example.com'

# Enterprise PKI server subject
$pkiSubj = 'Example Issuing CA'

# Get to the PCNS group1 folder
Set-Location -Path 'C:\Program Files\APC\PowerChute\group1\'

# Migrate keystore from JKS to PKCS12 format (there was a warning to use newer format for keystore file which I choose to follow up)
& "${env:JAVA_HOME}bin\keytool.exe" -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12 -srcstorepass $jksPwd

# Delete current certificate with key (requires Admin privileges)
& "${env:JAVA_HOME}bin\keytool.exe" -delete -alias securekey -keystore keystore -storepass $jksPwd

# Generate new keys and CSR
& "${env:JAVA_HOME}bin\keytool.exe" -genkeypair -alias securekey -keyalg RSA -keysize 2048 -dname "CN=${hostNameShort}, OU=IT, O=Example, L=City, ST=State, C=CT" -ext "SAN=dns:${hostNameLong},dns:${hostNameShort},ip:${hostIp}" -validity 365 -keypass $jksPwd -keystore keystore -storepass $jksPwd
& "${env:JAVA_HOME}bin\keytool.exe" -certreq -alias securekey -file "$env:TEMP\${hostNameShort}.csr" -keystore keystore -dname "CN=${hostNameShort}, OU=IT, O=Example, L=City, ST=State, C=RU" -ext "SAN=dns:${hostNameLong},dns:${hostNameShort},ip:${hostIp}" -storepass $jksPwd

# Sign CSR and retrieve P7B
& "certreq.exe" -submit -f -q -attrib "CertificateTemplate:${pkiTpl}" -config "${pkiHost}\${pkiSubj}" "$env:TEMP\${hostNameShort}.csr" "$env:TEMP\${hostNameShort}.crt" "$env:TEMP\${hostNameShort}.p7b" "$env:TEMP\${hostNameShort}.rsp"

# Import P7B
& "${env:JAVA_HOME}bin\keytool.exe" -import -noprompt -trustcacerts -alias securekey -file "$env:TEMP\${hostNameShort}.p7b" -keystore keystore -storepass $jksPwd

导入证书捆绑包的一般问题与密钥库有关。exe文件本身。似乎存在某种阻止导入有效证书链(CRT)的错误。根据keytool源代码,该实用程序还支持导入P7B文件。其他工具,如KeyStore Explorer,可能允许克服此问题,但需要在企业系统上安装/使用它们

更新:修复了密钥库和CSR中的SAN字段

宰父飞白
2023-03-14

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

有用的网址:html" target="_blank">http://www2.schneider-electric.com/resources/sites/SCHNEIDER_ELECTRIC/content/live/FAQS/176000/FA176886/en_US/ReplacingPowerU Linux上的自签名证书。pdf

•修改文件“/opt/APC/powersleet/group1/pcnsconfig”。ini'o在[NetworkManagementCard]部分添加KeystorePassword=您的密码这一行

•命令:服务动力滑槽停止

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

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

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

•命令:opt/APC/powersleet/jre1。7.0_45/bin/keytool-import-trustcacerts-alias securekey-file/opt/APC/powersleet/group1/bundle。cer-密钥库/opt/APC/PowerSleet/group1/密钥库

•命令:服务动力滑槽启动

当做

杰米

柳和怡
2023-03-14

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

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

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

文件中最底层的证书是根证书,上面是链中的第一个下级证书,这是第二个证书,一直到您正在使用的设备的新签名证书为止,它位于顶部。

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

我试图导入包使用keyool像这样:

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

基于留档keyool应该对此感到高兴,但我得到这个错误:

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

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

用密钥库浏览器打开密钥库(即问题和答案中名为keystore的文件)。右键单击密钥对,选择导入CA应答,并将其指向您之前准备的base64编码的X.509证书束。

在我的例子中,至少,KeyStore资源管理器成功地导入了在keyool失败的地方的MS ADCS证书包。一旦捆绑包被导入,我就可以继续使用keyool管理密钥存储,最终依赖于其https服务器的密钥存储的应用程序成功地使用了我们的MS ADCS证书。

 类似资料:
  • 问题内容: 我已经看过4个(是,四个)教程,但仍然不知道如何使它工作。 在我的Glassfish 4.1.1服务器中设置为HTTPS配置的第二个HTTP侦听器之后,我尝试创建证书,因此在浏览器中没有出现安全错误。问题是,我只是无法使keytool正常工作;无论我做什么,它都会弄乱并抛出奇怪的错误。例如,它找不到许多指南推荐的某些命令。 我可以猜测该工具在Java 8或其他版本中发生了变化,我真的不

  • 我已经看了4个(是的,四个)教程,仍然不知道如何使这工作。 编辑:说真的,我正因此陷入困境。我只是什么都不能做:cacerts密码不是典型的“changeit”,我不能在密钥库之外获取密钥,因此我不能用证书做任何事情。

  • 我正在使用以下命令导入密钥库中的证书: 它要求输入密码,并在cmd上显示以下结果:

  • 伙计们!我正在尝试使用bouncycastle创建X.509证书,它应该由另一个证书签名并存储它的PEM base 64格式。 我已经有了自签名证书(公钥和私钥)。现在我要创建一个新的,并用现有的自签名证书签名。 验证无例外地通过了,这意味着从我的观点来看,它是由Cacert成功签署的: 然后将其解码到PEM base 64:

  • 我想生成一个自签名的可信证书和一个csr,并用创建的可信证书对csr进行签名。我正在用keytool尝试它。在使用以下命令创建受信任证书的第一步中 keytool-list-v-keystore cert/test.keystore 使用上面的“genkey”命令创建的证书的条目类型为“privatekeyentry”,如何创建可信的证书条目?

  • 我试图创建自己的HTTPS服务器,我有两个代码片段: $curl-k-vvv https://example.org:443*重新构建URL到:https://example.org:443/*不支持名称查找超时*尝试127.0.0.1...*连接到example.org(127.0.0.1)端口443(#0)*ALPN,提供HTTP/1.1*密码选择:all:!导出:!导出40:!导出56:!a