重新颁发自签名根CA,而不会使它签名的证书无效


12

我为公司的一些内部服务创建了一个自签名的根证书颁发机构,该服务由我自己配置​​(主要通过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。


1
只有公钥和主题才能使证书唯一。因此,如果您都不更改任何内容,那么您应该能够重新签名证书,同时更改您的内心内容的所有其他字段和扩展名。
garethTheRed

@garethTheRed啊,那很有道理。我不确定该怎么做。您能否详细说明或发布更多答案?我希望-x509toreq可以从现有的根CA中恢复所有唯一的信息,但是要么没有,要么从那里的我的过程有问题。
AngerySysadmin

1
req -new -x509x509 -req -signkey包括默认的自签名证书的序列随机数(虽然这可以被覆盖)实际上是一个随机数。如果您的子证书(或其中的任何一个)包含使用'issuer + serial'选项(而不是'keyid'选项或在其中之外)包含AuthorityKeyIdentifier的情况(如果您ca与上游默认配置文件一起使用的话)需要创建一个与旧根目录相同的新根目录;使用-set_serial。...
dave_thompson_085

...但是,如果您尝试导入名称和序列号与现有证书相同的新证书,则某些sw可能会感到不满意。您可能需要先清理旧的。
dave_thompson_085

1
近交叉重复数据删除security.stackexchange.com/questions/17331/... PS:我认为这是可能到Windows手动获取缓存CRL的CA在这种情况下,缺乏CRLDP的可能不是问题,但如何不便,这将是我不知道。
dave_thompson_085

Answers:


6

只要证书的主题名称公钥匹配,就认为两个证书相同。

因此,您需要做的就是重复使用密钥,并确保新证书中的使用者名称与旧证书中的使用者名称相同。之后,您可以更改任何其他字段和/或扩展名,并且所得到的证书将被视为相同。

例如,创建您的OpenSSL配置文件:

[ req ]

prompt             = no
string_mask        = default
distinguished_name = x509_distinguished_name
x509_extensions     = x509_ext

[ x509_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.
# Adjust for your setup:

countryName = za
organizationName = My Company
organizationalUnitName = Security
commonName = My Root CA

[ x509_ext ]

basicConstraints = critical,CA:true
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier = hash
crlDistributionPoints = URI:http://security.mycompany.co.za/root.crl

并将其另存为rootca.cnf。确保中的元素[req_distinguished_name]与原始Root CA证书中的元素相同(这是相同的“主题名称”部分)。

接下来,运行:

openssl req -new -x509 -key rootca.key -out MyNewCA.pem -config rootca.cnf

rootca.key原始证书中使用的私钥在哪里(这是相同的公钥/私钥部分)。

这将创建MyNewCA.pem,您可以通过以下方式进行检查:

$ openssl x509 -noout -text -in MyNewCA.pem

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 17564687072266118846 (0xf3c24dd49d5166be)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=za, O=My Company, OU=Security, CN=My Root CA
    Validity
        Not Before: Jul 15 05:05:54 2017 GMT
        Not After : Aug 14 05:05:54 2017 GMT
    Subject: C=za, O=My Company, OU=Security, CN=My Root CA
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (2048 bit)
            Modulus:
                00:c8:3d:32:8a:56:31:f6:27:1a:ce:9e:b2:1d:fb:
                ce:9f:ce:5b:42:25:aa:fe:8b:f4:34:32:ac:b3:02:
                50:71:f8:c3:43:0c:c7:2c:9f:fe:48:1b:c6:c0:e7:
                d6:44:a9:e7:d7:a0:7e:58:f4:b6:38:61:7e:d0:af:
                0f:56:21:e7:49:7a:66:13:f5:7a:fe:3d:ab:65:f8:
                01:eb:52:a7:3b:ae:a0:cf:50:57:b9:e0:09:0b:1f:
                90:14:fb:18:56:1d:57:99:a9:76:a2:63:d1:c2:d3:
                a3:f4:3a:ff:91:0d:ee:8d:44:13:58:00:09:93:da:
                e8:6a:fd:64:5f:c3:42:8e:2a:49:6e:0d:73:b7:b9:
                d4:6c:c6:ce:30:c5:82:24:a5:00:37:17:a0:1d:f1:
                c9:e9:e3:18:48:22:4f:33:96:a7:3c:a9:31:f1:3f:
                14:40:6a:74:e8:78:82:45:04:d4:4b:56:0b:cd:be:
                48:8d:03:fb:39:70:0b:91:99:70:06:bd:5e:8b:f2:
                d1:f4:6f:fc:ce:e7:f8:3c:0a:20:ea:35:b8:5f:2f:
                ee:8d:ff:d3:93:85:6b:fb:71:db:1b:e6:e9:1d:a7:
                f8:e4:ae:f4:71:fe:35:a7:89:24:af:69:a4:34:3b:
                14:66:05:02:5e:2a:1d:ac:e0:d2:48:6c:13:4e:75:
                58:93
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Key Usage: critical
            Certificate Sign, CRL Sign
        X509v3 Subject Key Identifier: 
            3B:45:93:3A:2A:BC:39:29:36:13:6C:BD:B6:B4:31:C7:E7:BB:32:73
        X509v3 CRL Distribution Points: 

            Full Name:
              URI:http://security.mycompany.co.za/root.crl

Signature Algorithm: sha256WithRSAEncryption
     4d:96:d4:03:4f:e3:7c:26:be:59:f8:23:87:60:f7:4c:d3:a1:
     1c:77:a1:14:e3:e7:da:c8:2a:a3:1b:06:2a:4d:55:1c:83:26:
     73:46:0d:8a:e4:b7:d1:1e:38:cc:78:90:00:01:b3:8e:f9:3c:
     62:be:04:09:90:4e:22:87:b1:aa:bd:f9:73:bd:a7:76:ad:d5:
     ae:2d:7a:1c:1e:1a:67:c8:57:4c:f9:6d:8b:62:d6:e5:ea:e0:
     40:5c:12:28:7e:ea:f0:0c:d6:cd:f4:1d:d5:56:09:ad:43:b4:
     eb:8c:68:ce:56:a2:a8:ae:a4:d5:35:bb:58:b8:ed:82:82:b5:
     ef:cb:e2:6d:76:61:ed:ee:a5:1f:68:95:07:ed:5b:f0:65:92:
     d2:dc:1d:c6:fa:7f:e0:c9:38:c2:c6:6f:03:38:e7:3a:b0:24:
     06:e0:bc:07:dd:e7:a0:dc:74:09:e5:37:7b:66:e1:6f:47:4c:
     71:ff:02:48:7f:d4:4f:ce:cb:91:e9:ee:cd:b6:f1:0a:03:19:
     3e:19:05:7d:8f:48:e7:f1:cc:07:37:3d:91:3c:6f:54:71:3c:
     a2:6c:55:c3:03:c1:7f:eb:9e:70:f1:8f:a1:fb:62:33:8b:86:
     2c:79:bc:76:e2:01:9a:68:df:af:40:a1:b2:9c:f6:a1:e1:6e:
     2a:dd:1a:d6

使用此新证书代替原始证书。

您可以更改其他字段和扩展名,例如证书的有效期,但请记住,您basicConstraints = critical,CA:true对Root CA证书实际上没有任何约束(除外)。


经过进一步考虑,您的问题可能只是由于替换的Root CA证书没有扩展名basicConstraint,也可能没有keyUsage扩展名。可能值得尝试在您的ext.conf第一个扩展中添加这两个扩展,并使用-x509toreq您发布的方法测试生成的新Root CA证书。


感谢您的全面答复,它确实帮助我更好地理解了事情。有了这个和@ dave_thompson_085的评论,我设法以一种不会使子证书无效的方式重新生成我的CA。我最初的尝试有一些问题(我可能应该发布更详细的答案吗?)同时也要感谢“主题名称”是一个由那些特定字段组成的字段,这是显而易见的,但很重要的一点。我以某种方式怀疑其他人会发表答案,所以我接受这一答案。
AngerySysadmin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.