【发布时间】:2013-04-29 00:17:31
【问题描述】:
我维护了一个本地部署的 java 小程序。我最近从 Go Daddy 购买了一个代码签名证书(它很便宜,而且他们已经托管了我们的网站)。我的证书链如下(所有文件都在https://certs.godaddy.com/anonymous/repository.pki):
- 我的公司
gdig2.cergdroot-g2.crt
不幸的是,Windows 7(IE 使用)或 Windows JRE(我认为其他浏览器使用)默认情况下未安装此根。手动安装根证书是可行的,但它要求我的用户具有管理员访问权限或运行不熟悉的命令(从安全角度来看,说“你可以信任我的小程序,并证明它,运行这个也没有多大意义”计算机上的命令”)。
我想将我的证书链更改为
- 我的公司
gdig2.cergdroot-g2_cross.crtgd-class2-root.crt
这似乎更普遍(例如,它是 Windows JRE 中的一个,用于验证 https://www.godaddy.com,从而将其引入 Windows 7)。 Go Daddy 无法为我执行此操作(“我们对使用我们的代码签名证书之一的支持有限”),因此我只能自己执行此操作。
在this answer 之后,我最有希望的方法如下(在 Mac OS X 10.6 上):
- 将我的证书转换为 pem 格式:
$ openssl pkcs12 -in myCert.p12 -out myCert.pem -nodes - 使用文本编辑器打开myCert.pem,删除
gdroot-g2.crt,并粘贴gdroot-g2_cross.crt和gd-class2-root.crt(openssl似乎不关心证书的顺序,但我按上面显示的顺序放置) - 将证书转换回 p12 格式:
$ openssl pkcs12 -export -in myCert.pem -out combined.p12
不幸的是,这并不完全奏效。来电$ keytool -list -storetype pkcs12 -keystore combined.p12 -v
表明我的证书链延伸到gdig2.cer,然后停止。问题似乎是gdroot-g2_cross.cer 不认证gdig2.cer:
$ openssl verify -CAfile gd-class2-root.cer gdroot-g2_cross.cer
gdroot-g2_cross.cer: OK
$ cat gd-class2-root gdroot-g2_cross.cer > gdRootCross.pem
$ openssl verify -CAfile gdRootCross.pem gdig2.cer
gdig2.cer: /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
error 20 at 0 depth lookup:unable to get local issuer certificate
但在我看来一切都很好:
$ openssl x509 -in gdig2.cer -text -noout
. . .
Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
X509v3 Authority Key Identifier:
keyid:3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE
. . .
$ openssl x509 -in gdroot-g2_cross.cer -text -noout
. . .
Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=https://certs.godaddy.com/repository/, CN=Go Daddy Root Certificate Authority - G2
X509v3 Subject Key Identifier:
3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE
. . .
这让我认为我没有正确使用交叉证书,但我不知道我做错了什么。 (我还尝试将两个新证书附加到我的原始链中,openssl verify 表示 error 18 at 0 depth lookup:self signed certificate。)我几乎愿意相信不可能更改根证书,但这似乎是整个交叉点证书。 如何将交叉证书引入我的证书链,以便由不同的根证书颁发机构进行验证?
【问题讨论】: