RSAキーペアを使用して署名および署名を検証しようとしています。
キーペアを生成する方法は次のとおりです(暗号化/復号化には問題なく機能します)。
ssh-keygen -t rsa -f mykey -N '' -b 2048
mv mykey mykey-priv.pem
ssh-keygen -f mykey.pub -e -m pem > mykey-pub.pem ; rm -f mykey.pub
ただし、ハッシュを(秘密鍵を使用して)暗号化してから(公開鍵を使用して)検証しようとすると、失敗します。
openssl dgst -sha256 /etc/hosts > /tmp/hash
openssl rsautl -sign -inkey mykey-priv.pem -in /tmp/hash -out /tmp/signature
openssl rsautl -verify -pubin -inkey mykey-pub.pem -in /tmp/signature
最後の行は私に公開鍵をロードできません
私が欠けているものは?
関連する場合は、CentOS 3.9を使用しています(古いものとレガシーですが、ここでは選択の余地がありません)。
最後に、サンプルのキーペアを次に示します。
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA8nVhTRuinf4bGAda1ufF+VGG6f8kIFGt8/oCK74n9E6lXgpu
7KqeRzadaiONDh8GgQXn5bX9O2vOL+sL0xYa3W13eCoT7+4U51C/+8HqBxujRAVm
i4r/Ju+52kober+GSuIfoNF2nMA24EDy9tid0JgHcBJ0NTyhv6sPvNfcFR1Flbpo
LixTGCcn5S9A9NzJXiOkZ6abnxmyEmZsEaboowMay027GLWAw186GODbrGBByhjq
W6W6jcijb7EFdIYCEqtC6RsZmAiuPBK0LfW5078GE05oIZrG8GtQR8f7k8HDpEDF
+ZI53CZiLhrcXq6+tS4U57FqQs8ytUf6Gno7JwIDAQABAoIBAQCn7zd64gZLqmJ3
zThVG+obGyX4U3lhTVHQaD0ysR4ZcJPHxDA6ip7gsmprxr3/puupWD7b86a3jp8c
v4/MIEZxUk3qlDKFAAHIijy/kvuW+sSl65uwUZETFf5DvQq1hYzttxuzFwIx5kzc
HQBsi3MbtQGJ1a5Z5WofSMu4wEa289tAjHQiaXs8WEbgOctwS11lhFbDLwLagBFz
FL+J0C0oGjgNYaLJUihZKsMHCPZ0/LVFDcCus0ep7mQmvAEQ3FhSNNVakUL07XmM
MC6PTUxUvQa8vGDlRnXwGlIWVFNevvudvZjs02J7KWc3hUH9DqXiEm7cClJfoISB
HIq4WFvpAoGBAP0UHfCRyv4/2nZmizX05NG/qMNuz97G6Rir2ltw9wmrpvqK/n4r
d1JX19ECCx2nQM04C4Q7jQMmyqpF21Wf903PrGXPBa8j5XIDJy+YPC2RrifGsaHm
wN1EmYVfYZCphwmTIO2D05n/4Zkgze/KmhMnqpWn27De+LLfgcxsbET7AoGBAPVB
4RvpQCfKdP+ieKRopDE0v+UkdQCogdUz0rhwAdwzhXmUZIJ/Xb4a15DIN+zxKz2h
aiIJFkifKw5bQQQQjiIuRN73YpjQ6D9jWTdEs3E1zaWYFNPNAYqSi/1g/udgLL0N
RAOw5aNCDyOV4OZRESa9rhUUngfK4VrbqWIm1pLFAoGBAOBGWZn9uaTDNXjDuw6f
7b+rV4WJyBEmuR8x/JoYa/RX9+wEDTAGmQGR8yG3693lgFndFueiVn66e9OVgKBK
2MBOD/tRETp6VzVIcguNn5bKiUmanYRamAP+bQZy1mV6tr7XcdDKiFTrHCO1nIqq
QwxClLt3PAtsLX1m8QIV+4TNAoGBAMA161hWi2Mj9mHKUUZ4hAXUU3ggBFqJtYcD
4GeP0MVk03yfYc4sR6mPm9XqNHpL4BmjAWy/Nmmf5LyRo/itiNcc7/jWZL1jLEFR
eUApZYCaLBtVfy0nA8g4ZeIkPGHVK/rWBLHn13EFepvnAKVAb3KvQVlgGSH+THNK
qAs2aQAJAoGAabSXLpXsZTdy1lMUtZlvUhH4tLVgHFJGILMQ3bh2TTMnkaVbPFyy
KDeK+QJGaqjTx1SIXYgANR5cYI1xNge6aVA6T2aY2Dlq3qpAOK3sJWhEZYDxJKeq
Oy97h96/n14jdfh1U4TValcZfgVXqAfBMjxx0fPtSQjIn2RVjZRBpFs=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA8nVhTRuinf4bGAda1ufF+VGG6f8kIFGt8/oCK74n9E6lXgpu7Kqe
RzadaiONDh8GgQXn5bX9O2vOL+sL0xYa3W13eCoT7+4U51C/+8HqBxujRAVmi4r/
Ju+52kober+GSuIfoNF2nMA24EDy9tid0JgHcBJ0NTyhv6sPvNfcFR1FlbpoLixT
GCcn5S9A9NzJXiOkZ6abnxmyEmZsEaboowMay027GLWAw186GODbrGBByhjqW6W6
jcijb7EFdIYCEqtC6RsZmAiuPBK0LfW5078GE05oIZrG8GtQR8f7k8HDpEDF+ZI5
3CZiLhrcXq6+tS4U57FqQs8ytUf6Gno7JwIDAQAB
-----END RSA PUBLIC KEY-----
余談ですが、ssh-keygen -m
はOpenSSHのかなり新しいバージョンにのみ存在し、CentOS3.9で予想されるよりもはるかに新しいものです。サイドリポジトリを使用しましたか、それとも自分で作成しましたか?とにかく...
OpenSSHが「PEM」と呼ぶものは、OpenSSLがここで使用する種類のPEMではありません。
背景:OpenSSL libraryは、PEM形式とDER形式の両方で2種類の公開鍵構造を長い間サポートしてきました。
サポートされている各アルゴリズムに固有の「レガシー」構造で、次のようなPEMヘッダーがあります。-----BEGIN RSA PUBLIC KEY-----
-----BEGIN DSA PUBLIC KEY-----
-----BEGIN EC PUBLIC KEY-----
ルーチンによって実装されますPEM_{write,read}{RSA,DSA,EC}PublicKey
x.509によって定義されたSubjectPublicKeyInfo
という名前の1つの一般的な構造とPEMヘッダー-----BEGIN PUBLIC KEY-----
!!アルゴリズム名がないことに注意してください
ルーチンによって実装されますPEM_{write,read}{,RSA,DSA,EC}PUBKEY
ただし、OpenSSL commandlineは、rsautl -pubin
を含め、後者をほぼ排他的に使用します。あなたは前者を持っているのを見ることができます。どうして?
OpenSSH、最近-m
フォーマットオプションをssh-keygen -e
エクスポートに追加したとき、OpenSSLレガシー構造PEM
と不可解に名前が付けられましたが、OpenSSLX.509汎用構造PKCS8
--PKCS#8ではありませんが、これはprivateキーの標準で一般的な形式です。
つまり、オプションは次のとおりです:
見た目は悪いが実際には正しいフォーマットオプションを使用するssh-keygen -e -m pkcs8
doesレガシー構造を処理する唯一の操作を使用して、ファイルを変換します。openssl rsa -in sshpub_called_pem -RSAPublicKey_in -out goodpub -pubout
ただし、OpenSSL1.0.0以降のみ。
openSSHプライベートキーファイルがOpenSSL互換形式(OpenSSHに最近追加された-----BEGIN RSA PRIVATE KEY-----
ではなく-----BEGIN OPENSSH PRIVATE KEY-----
)の場合、OpenSSLを使用できます代わりにssh-keygen -e
:openssl rsa -in sshprivate -pubout -out pubforopenssl
または1.0.0以降では、光沢のある新しい代替手段openssl pkey -in sshprivate -pubout -out pubforopenssl
警告もあります:rsautl -sign|-verify
(デフォルト)はPKCS#1-v1.5(別名タイプ01)パディングを使用しますが、は、ASN.1 SEQUENCE
でハッシュもエンコードする必要がある標準に準拠していません。この方法で作成した署名は、標準に準拠している他のソフトウェアでは検証されず、他のソフトウェアで作成された署名は、異なる(部分的に一致する)結果をもたらします。代わりに使用することを検討してください
openssl {dgst -hashname | hashname} {-sign privatekey | -verify publickey}
これは完全な操作を実行します:データのハッシュ、ASN.1エンコード、パディングおよびRSA署名、または逆にRSA検証、アンパディング、デコード、および照合。または
openssl pkeyutl -sign|-verify -inkey key [-pubin] -pkeyopt digest:hashname
ここで、キーはRSAキーであり、PKCS#1-v1.5 exceptデータのハッシュをすべて実行します。例えば。:
https://stackoverflow.com/questions/9380856/openssl-signature-difference-when-using-c-routines-and-openssl-dgst-rsautl-
https://stackoverflow.com/questions/13419201/why-are-the-rsa-sha256-signatures-i-generate-with-openssl-and-Java-different
https://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst
https://crypto.stackexchange.com/questions/27079/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign
https://crypto.stackexchange.com/questions/27892/verify-a-rsa-signature-using-only-rsa-encryption