証明書¹と秘密鍵ファイル²がある場合、証明書の公開鍵が秘密鍵と一致するかどうかをどのように判断できますか?
私の最初の考えは、証明書の公開キーでテキストを暗号化し、秘密キーで解読しようとすることでした。往復する場合、勝者がいます。 OpenSSLでこれを行う方法を理解できません。
あるいは、秘密鍵から公開鍵を生成できれば、指紋を比較するだけで済みます。 SSHにはこのためのコマンドがあるようです(ssh-keygen -y -f my_key > my_key.pub
)ですが、ハッシュが一致しません。 (Webサーバーが証明書を提供しているので、証明書に対応するキーがあることはほぼ確実ですが、サーバーを起動してチェックする簡単な方法が欲しいです。)
x x509形式の.crtファイルだと思います。 OpenSSLはopenssl x509 -text -in that_cert.crt
²RSA秘密鍵
現在のディレクトリにssl.crtとssl.keyがあると仮定します。
証明書の内容を確認したい場合は、
# openssl x509 -in ssl.crt -text -noout
ここにあるものの2つは、RSA公開鍵の係数と指数(16進数)です。
秘密鍵の内容を確認したい場合は、
# openssl rsa -in ssl.key -text -noout
公開鍵は通常そこにあることに注意してください(少なくとも、秘密鍵が機能するためにはモジュラスがそこにある必要があり、公開指数は通常65537または3です)。したがって、単純に係数と公開指数が一致するかどうかを確認できます。確かに、秘密鍵が実際に有効である(つまり、dとeが係数mの有効なRSA指数である)ことを確認したい場合は、次を実行する必要があります。
# openssl rsa -check -in ssl.key -noout
編集(2018):信頼できないソースからの秘密鍵が証明書に対応していることを確認する場合は、秘密鍵が有効であることを確認する必要があります。 「漏えいした」秘密鍵の有効性をチェックしないとCAが証明書を不適切に取り消す原因となる例については、 ここ を参照してください。キーペアが有効に生成されていることがわかっている場合は、この手順を省略できます。
これで、証明書と秘密鍵の両方から公開鍵を生成し、diff
を使用して、それらに違いがないことを確認できます。
# openssl x509 -in ssl.crt -pubkey -noout > from_crt.pub
# openssl rsa -in ssl.key -pubout > from_key.pub
# diff from_crt.pub from_key.pub
または、ファイルを作成しない1つのライナーとして( プロセス置換 を使用):
# diff <(openssl x509 -in ssl.crt -pubkey -noout) <(openssl rsa -in ssl.key -pubout)
キーが一致する場合、diffは何も返しません。 (おそらく、2番目のコマンドからstderrへの「RSAキーの書き込み」出力が表示されます)。
証明書と秘密鍵が一致しなかった場合、Webサーバーが大声で不平を言うことに注意してください。たとえば、nginxが使用している証明書に間違ったキー(同じサイズ、同じ公開指数ですが、昨年のキー)を使用しているnginxの場合:
# Sudo /etc/init.d/nginx restart
* Restarting nginx nginx
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/private/wrong_key.key") failed
(SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed
受け入れられた答えは正しいですが、RSAキーに対してのみ機能します。
少なくともopenssl 1.1.1以降、すべてのタイプの秘密鍵の有効性をテストすることが可能であり、opensslがサポートするあらゆる種類の鍵に対して機能するワンライナーがここにあります
cmp <(openssl x509 -pubkey -in certificate.pem -noout) <(openssl pkey -check -pubout -in private-key.pem -outform PEM)
秘密鍵が証明書の公開鍵と一致する場合にのみ、「true」を返します。