certificate - 如何将交叉签名证书引入链中?

标签 certificate code-signing

我维护一个本地部署的java小程序。我最近从 GoDaddy 购买了代码签名证书(价格便宜,而且他们已经托管了我们的网站)。我的证书链如下(所有文件均可在 https://certs.godaddy.com/anonymous/repository.pki 获取):

  1. 我的公司
  2. gdig2.cer
  3. gdroot-g2.crt

不幸的是,Windows 7(由 IE 使用)或 Windows JRE(我认为由其他浏览器使用)上默认未安装此根目录。手动安装根证书是可行的,但它要求我的用户具有管理员访问权限或运行不熟悉的命令(从安全角度来看,说“你可以信任我的小程序,并证明这一点,运行这个”也没有多大意义您计算机上的命令”)。

我想将我的证书链更改为

  1. 我的公司
  2. gdig2.cer
  3. gdroot-g2_cross.crt
  4. gd-class2-root.crt

这似乎更普遍(例如,它是 Windows JRE 中的一个,用于验证 https://www.godaddy.com ,从而将其带入 Windows 7)。 GoDaddy 无法为我执行此操作(“我们对使用我们的代码签名证书之一的支持是有限的”),因此我只能自己执行此操作。

已关注 this answer ,我最有希望的方法如下(在 Mac OS X 10.6 上):

  1. 将我的证书转换为 pem 格式:
    $ openssl pkcs12 -in myCert.p12 -out myCert.pem -nodes
  2. 使用文本编辑器打开 myCert.pem,删除 gdroot-g2.crt,然后粘贴 gdroot-g2_cross.crtgd-class2- root.crt (openssl 似乎不关心证书的顺序,但我将它们按照上面显示的顺序放置)
  3. 将证书转换回 p12 格式:
    $ openssl pkcs12 -export -in myCert.pem -out合并.p12

不幸的是,这不太有效。调用
$ keytool -list -storetype pkcs12 -keystore合并.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 深度查找:自签名证书。)几乎愿意相信不可能更改根证书,但这似乎就是交叉证书的全部要点。 如何将交叉证书引入我的证书链中,以便由不同的根证书颁发机构进行验证?

最佳答案

你不知道。您只有一个由第一权威机构签署的证书;以及由第二个权威机构签署的一份证书 - 两者都具有相同的公钥/指纹和主题行。就是这样。

关于certificate - 如何将交叉签名证书引入链中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378479/

相关文章:

certificate - 如何签署MSI?

ios - 在 iPad 中运行时配置文件错误

powershell - 使用 PowerShell 将 IIS SSL 证书分配给与主机 header 的绑定(bind)

inno-setup - 在 Inno Setup 中,我必须在哪里指定 SignTool 的参数和特殊序列?

openssl - 如何将 .p12 转换为 .crt 文件?

objective-c - Xcode 在设备上运行之前立即崩溃

Android - 下载应用程序

c++ - iOS SDK 是否可以与动态库一起交付

java - 我可以签署 Java 类文件吗

inno-setup - 我可以在编译 Inno Setup 安装程序后对其进行签名,而不是使用 SignTool 指令吗?