私はSSH(正確にはLinuxではOpenSSH 5.5p1)を使用しています。私はパスフレーズを持っているキーを持っています。これは通常のコンピュータへのログインに使用します。
ファイルの署名にも使用できますか?
私が理解しているように、SSHキーはRSA(またはDSA)キーであり、SSHログインプロセス中に、サーバーに送信されるメッセージに署名するために使用されます。原則として、そして実際には、署名に使用することができます-実際、それが唯一の目的です。
しかし、私が見る限り、(PGPの場合のように)キーを使用して任意のファイルに署名する方法はありません。これを行う方法はありますか?
OpenSSHツールだけでこれを行う方法はないかもしれません。
しかし、それはOpenSSLツールで非常に簡単に行うことができます。実際、それを行うには少なくとも2つの方法があります。以下の例では、~/.ssh/id_rsa
が秘密鍵です。
1つの方法はdgstを使用することです:
openssl dgst -sign ~/.ssh/id_rsa some-file
もう1つはpkeyutlを使用しています:
openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file
これらはどちらも、バイナリ署名を標準出力に書き込みます。 dgstは-hex
オプションを取り、署名の形式に関する詳細とともにテキスト表現を出力します。 pkeyutlは、少し役に立たない-hexdump
オプションを取ります。どちらもRSAキーとDSAキーの両方を受け入れます。出力の形式が何であるか私にはわかりません。 2つのコマンドは異なるフォーマットを生成します。 pkeyutlはdgstよりも新しいと考えられているようです。
これらの署名を確認するには:
openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file
そして:
openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file
ここでの問題は$PUBLIC_KEY_FILE
です。 OpenSSLはOpenSSHの公開鍵形式を読み取ることができないため、id_rsa.pub
だけを使用することはできません。いくつかのオプションがありますが、どれも理想的ではありません。
OpenSSHのバージョンが5.6以降の場合、明らかにこれを行うことができます。
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem
OpenSSLが読み取ることができるPEM形式の標準出力に公開キーを書き込みます。
秘密鍵があり、それがRSA鍵である場合、公開鍵をそこから抽出できます(PEMでエンコードされた秘密鍵ファイルには公開鍵のコピーが含まれていると思います。公開鍵を導出することはできないためです。秘密鍵自体から)、それを使用します:
openssl rsa -in ~/.ssh/id_rsa -pubout
同等のDSAがあるかどうかはわかりません。このアプローチでは、秘密鍵の所有者から何らかの協力が必要であることに注意してください。秘密鍵の所有者は、公開鍵を抽出して検証者に送信する必要があります。
最後に、 a Python Larsと呼ばれるchapによって記述されたプログラム を使用して、公開鍵をOpenSSHからOpenSSL形式に変換できます。
@Tomの回答は私を始めるのに役立ちましたが、そのままでは機能しませんでした。
これらのコマンドは、次のもので動作します。
Pkeyutlの使用
# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature Verified Successfully
Dgstの使用
# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Verified OK
Pkeyutlバージョンは、小さいサイズのファイルにのみ署名できます。 dgstは結果に署名する前にダイジェストを取るため、dgstは任意の大きなファイルに署名できます。