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


11

社内のいくつかの内部サービス用に自己署名ルート認証局を作成し、それを自分で構成しました(ほとんどが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

ほとんどの場合、証明書がどのように機能するのか、そしてその理由についてより多くの洞察を探しています。しかし、私はこの問題につながる問題の解決策も歓迎するので、ここにも背景情報があります。

どのように私はこの混乱になった:エクスプローラ人民元は、Windows上で証明書GUIをインストールするか、または→を経由して、私のCAがインストールされると、HTTPS内部サービスには素晴らしい仕事/usr/local/share/ca-certificatesが続くupdate-ca-certificatesDebianとUbuntuの上。しかし、最近、例外が発生しました。Windows上のGit、特にSSLバックエンドとしてWindows Secure Channelを使用するためにインストールされている場合です。デフォルトでは、SSL証明書にCRLフィールドが存在する必要があるようです。

だから私はそれが実際にWindows Secure Channelの問題だと思うのは、私が走り続けるエラーメッセージは完全に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をインストールし、git.http.sslcainfoが指すファイルにCAを手動で連結すると動作しますが、ユーザーがこのプロセスよりも手間がかかると感じた場合、SSL ID検証に気を取られない傾向があります「簡単な」Windows証明書インストーラーGUIをクリックします。


1
公開鍵とサブジェクトのみが証明書を一意にします。したがって、どちらも変更しない場合は、他のすべてのフィールドと拡張子を心のコンテンツに変更しながら、証明書に再署名できる必要があります。
-garethTheRed

@garethTheRedああ、それは理にかなっています。これを行う方法がわかりません。詳細を記入して回答を投稿していただけますか?-x509toreq既存のルートCAからすべての一意の情報を回復することを望んでいましたが、そうでないか、そこからのプロセスに問題があります。
AngerySysadmin

1
req -new -x509そしてx509 -req -signkeyデフォルト乱数(これは上書きすることができるが)有効ナンスに自己署名証明書のシリアル両方。あなたの子供の証明書(またはそれらのいずれか)を使用すると、使用した場合ケースになります「発行人+シリアル」オプション(の代わりに、または「キーID」オプションに加えて)、使用してAuthorityKeyIdentifierが含まれている場合ca、あなたは、上流のデフォルトの設定ファイルでの古いルートと同じシリアルで新しいルートを作成する必要があります。を使用します-set_serial。...
dave_thompson_085

...しかし、既存の証明書と同じ名前でシリアルの新しい証明書をインポートしようとすると、一部のswは不満に思うかもしれません。最初に古いものを一掃する必要があるかもしれません。
dave_thompson_085

1
近クロスデュープsecurity.stackexchange.com/questions/17331/... PS:私は考えて、それはWindowsが手動でCRLDPの不足がない問題かもしれない、その場合、CAのCRLをキャッシュするために取得することが可能ですが、どのようになり不便知りません。
dave_thompson_085

回答:


5

サブジェクト名と証明書の公開キーが一致する限り、2つの証明書は同じと見なされます。

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

たとえば、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

オリジナルの代わりにこの新しい証明書を使用します。

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


さらに検討した結果、問題は単に、交換用のルートCA証明書basicConstraintkeyUsage拡張子が含まれていない可能性があるという事実にある可能性があります。これら2つの拡張機能をext.conf最初に追加し、-x509toreq投稿した方法を使用して、結果の新しいルートCA証明書をテストしてみる価値があります。


包括的な回答のおかげで、物事をよりよく理解できるようになりました。これと@ dave_thompson_085のコメントを使用して、子証明書を無効にしない方法でCAを再生成することができました。私の元の試みにはいくつか間違った点がありました(おそらくより詳細な回答を投稿する必要がありますか?)。他の誰かが答えを投稿することをどういうわけか私は疑うので、私はこれを受け入れています。
AngerySysadmin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.