我为公司的一些内部服务创建了一个自签名的根证书颁发机构,该服务由我自己配置(主要通过HTTPS提供)。然后,我为此证书创建了证书,并与此CA签署了证书。
现在,我想向根CA添加一个x509扩展名(CRL分发点),而不会使从该CA颁发的现有服务器证书无效。这可能吗?
我的直觉是“是”,因为据我了解,对证书身份的“完全授权” ,访问相应的私钥是必要和充分的。也就是说,除非在生成证书时(可能)将某种随机数与公钥一起合并到证书中。
我对SSL证书管理仍然相当陌生,但是我(我认为)了解标准信任链的基础。我对其他PKI加密的基本用法也很满意:我管理SSH密钥,并使用GPG进行签名和加密。我只是学习过计算机科学,尽管我只是密码学的自学入门者。
我从未为原始IIRC制作过CSR(我认为这是的直接输出openssl req -new -x509
)。当然,我仍然拥有原始CA的私钥,并且使用它,我能够将原始证书“反向”为证书签名请求:
openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key
我希望这可以有效地“提取”上述随机数,并允许我重新创建证书,但是这次使用一个crlDistributionPoints
字段,因此,与原始CA签署的所有证书仍将针对该新CA进行验证,但例外客户端将从字段中指定的HTTP URL检索我的CRL文件(当前为空)。
所以我做了一个扩展配置文件ext.conf
:
[ cert_ext ]
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl
我从CSR生成了根CA的新版本:
openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem
现在,当我使用 openssl x509 -text -in MyNewCA.pem | less
我可以看到CRL扩展部分:
X509v3 extensions:
X509v3 Subject Key Identifier:
82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
X509v3 CRL Distribution Points:
Full Name:
URI:http://security.mycompany.co.za/root.crl`
可惜!我以前签署的证书不再针对此证书进行验证:
openssl verify -verbose -CAfile MyCA.pem git.pem
git.pem: OK
openssl verify -verbose -CAfile MyNewCA.pem git.pem
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate
通常,我正在寻找有关证书如何工作以及原因的更多见解。但我也欢迎解决导致这一问题的解决方案,所以这里也是一些背景信息。
我如何陷入困境:一旦通过Windows上的Explorer RMB→Install Certificate GUI安装了我的CA,或者/usr/local/share/ca-certificates
随后update-ca-certificates
在Debian和Ubuntu上安装了CA,则内部服务的HTTPS便可以很好地工作。但是我最近遇到了一个例外:Windows上的Git,特别是如果安装为使用Windows Secure Channel作为SSL后端的Git。默认情况下,它显然坚持认为SSL证书中必须有一个CRL字段。
所以我想这确实是Windows安全通道问题,因为我一直遇到的错误消息似乎完全是特定于Microsoft的: fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.
如果我使用OpenSSL安装Git并手动将我的CA连接到git.http.sslcainfo指向的文件上,则它可以正常工作,但是我担心如果用户觉得此过程比您付出更多的努力,我的用户将倾向于使用SSL身份验证。单击“简易” Windows证书安装程序GUI。
-x509toreq
可以从现有的根CA中恢复所有唯一的信息,但是要么没有,要么从那里的我的过程有问题。
req -new -x509
并x509 -req -signkey
包括默认的自签名证书的序列随机数(虽然这可以被覆盖)实际上是一个随机数。如果您的子证书(或其中的任何一个)包含使用'issuer + serial'选项(而不是'keyid'选项或在其中之外)包含AuthorityKeyIdentifier的情况(如果您ca
与上游默认配置文件一起使用的话)需要创建一个与旧根目录相同的新根目录;使用-set_serial
。...