web-dev-qa-db-ja.com

自己署名ルートCAによって署名された証明書を無効にせずに再発行

私は社内でいくつかの内部サービス用に自己署名ルート認証局を作成し、それを自分で構成しました(ほとんどがHTTPSで提供されていました)。次に、これらのサービスの証明書を作成し、このCAで署名しました。

次に、このCAから発行された既存のサーバー証明書を無効にすることなく、x509拡張(CRL配布ポイント)をルートCAに追加します。 これは可能ですか?

私の直感は「はい」です。私が理解しているように、対応する秘密鍵へのアクセスが必要であり証明書IDに対する「完全な権限」に十分です。つまり、証明書が生成されるときに(おそらく)公開鍵とともに証明書に組み込まれるなんらかのナンスがない場合を除きます。

私はまだ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
_

主に私は証明書がどのように機能するのか、そしてその理由についてより多くの洞察を求めています。しかし、これにつながる問題の解決策も歓迎します。そのため、背景情報もいくつか紹介します。

この混乱の原因:ExplorerからCAをインストールすると、内部サービスへのHTTPSが適切に機能するRMB→Windowsに証明書GUIをインストールするか、_/usr/local/share/ca-certificates_に続いて_update-ca-certificates_はDebianとUbuntuですが、最近、例外が発生しました:WindowsのGit、特にWindowsセキュアチャネルをSSLバックエンドとして使用するようにインストールされている場合。デフォルトでは、SSL証明書にCRLフィールドが必要であると言われています。

したがって、私が実行し続けているエラーメッセージは完全にMicrosoft固有のように見えるため、これは本当にWindowsセキュアチャネルの問題だと思います:fatal: unable to access 'https://[email protected]/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をインストールし、git.http.sslcainfoが指すファイルに手動でCAを連結すると機能しますが、このプロセスの方がより労力がかかると感じた場合、ユーザーはSSL ID検証に手を出そうとはしません。 「簡単な」Windows証明書インストーラGUIをクリックする。

12
AngerySysadmin

2つの証明書は、証明書のSubject NamePublic Keyが一致する限り、同じと見なされます。

したがって、必要なことは、キーを再利用して、新しい証明書のサブジェクト名が古いものと同じであることを確認することだけです。その後、他のフィールドや拡張機能を変更できます。結果の証明書は同じと見なされます。

たとえば、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]の要素が、元のルート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

元の証明書の代わりにこの新しい証明書を使用してください。

証明書の有効期間など、他のフィールドや拡張機能を変更することもできますが、ルートCA証明書には(basicConstraints = critical,CA:true以外の)制約を実際に設定しないでください。


さらに検討した結果、問題の原因は、置換後のルートCA証明書にbasicConstraintがなく、場合によってはkeyUsage拡張子もないことが原因である可能性があります。最初にこれら2つの拡張機能をext.confに追加し、投稿した-x509toreqメソッドを使用して、結果の新しいルートCA証明書をテストすることをお勧めします。

6
garethTheRed