誰かが私に証明書といくつかの秘密/公開鍵をくれて、「どの秘密鍵が証明書と一致するか教えてください」と言いました。それ、どうやったら出来るの?
証明書はPKCS#7形式であり、次で始まります。
-----BEGIN CERTIFICATE-----
キーはすべて異なって見えます。それらのいくつかは実際には公開鍵です-いくつかは私にはわかりません。それらは異なる拡張子を持ち、次のように異なる文字列で始まります。
-----BEGIN PRIVATE KEY-----
-----BEGIN EC PARAMETERS-----
-----BEGIN RSA PRIVATE KEY-----
何か助けはありますか? opensslコマンドラインツールを使用できると思います。
秘密鍵が証明書と一致することの確認 (元々は Apache SSL FAQ )で指定されたコマンドに基づいて、次のすべての*.key
ファイルを反復処理する小さなbashスクリプトを作成できます。フォルダーを作成し、証明書のmodulus部分をすべてのキーと一度に比較します。
私のfindkey.sh
は、証明書のファイル名をコマンドライン引数として受け取り、一致するものを出力します。
#!/bin/bash
cert=$1
crthash=$(openssl x509 -noout -modulus -in "$cert" | openssl md5)
echo $cert $crthash
for file in *.key; do
[ -e "$file" ] || continue
keyhash=$(openssl rsa -noout -modulus -in "$file" | openssl md5)
if [ "$keyhash" = "$crthash" ]
then
keytest==$(openssl rsa -in "$file" -check -noout)
echo $file $keyhash $keytest
fi
done
いくつかのキーペアtestN.key
/testN.crt
を作成し、スクリプトをテストしました。これでうまくいくようです。
./findkey.sh test4.crt
test4.crt (stdin)= 8e30eac60ff8d3c5b1c9bee7e79774bb
test4.key (stdin)= 8e30eac60ff8d3c5b1c9bee7e79774bb =RSA key ok
キーの中にいくつかの証明書(または証明書要求)があるかどうかは関係ありません。*.key
という名前が間違っていても、openssl rsa -modulus
は証明書のモジュラスではなくunable to load Private Key
エラーを返すためです。さらに、行の終わりは、キーが一貫しているかどうかを示し、 偽の秘密キー を防ぎます。このスクリプトとOpenSSLのみをインストールする必要があります。
証明書キーマッチャーツールを使用して、次のように秘密キーが証明書と一致するかどうかを確認できます。
https://www.sslshopper.com/certificate-key-matcher.html
さらに、opensslコマンドラインツールを使用する場合は、以下をお読みください。
照合する最も簡単な方法は、秘密鍵を使用して署名を生成し、すべての証明書を試して署名を検証することです。証明書が暗号化専用であるためにこれが失敗した場合は、それをオーバーライドするか、何かを暗号化してから秘密鍵を使用して復号化することができます。
これらのアクションのいずれかが成功した場合は、一致するものがあることがわかります。これらの操作は、定義上、使用されているアルゴリズムの正しいキー関係なくでのみ成功します。もちろん、機密性の高いものには署名/暗号化しないように注意する必要があります。最終的に結果を捨てたほうがいいです。
復号化/検証中に使用されるスキームに対して正しい操作を使用していることを確認する必要があります(ただし、それは当然のことだと思います)。ちなみに、ECDSAは署名の生成/署名にのみ使用できます。
上記が適切でないのは、法的に拘束力のある署名または秘密鍵の使用のためのカウンター(ハードウェアデバイスなど)がある場合のみです。
適切な暗号化/検証を行うには、trust公開鍵を使用する必要があることに注意してください。つまり、証明書を検証し、証明書の署名も検証する必要があります。