web-dev-qa-db-ja.com

sshキーを使用してファイルに署名することは可能ですか?

私はSSH(正確にはLinuxではOpenSSH 5.5p1)を使用しています。私はパスフレーズを持っているキーを持っています。これは通常のコンピュータへのログインに使用します。

ファイルの署名にも使用できますか?

私が理解しているように、SSHキーはRSA(またはDSA)キーであり、SSHログインプロセス中に、サーバーに送信されるメッセージに署名するために使用されます。原則として、そして実際には、署名に使用することができます-実際、それが唯一の目的です。

しかし、私が見る限り、(PGPの場合のように)キーを使用して任意のファイルに署名する方法はありません。これを行う方法はありますか?

37
Tom Anderson

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つのコマンドは異なるフォーマットを生成します。 pkeyutldgstよりも新しいと考えられているようです。

これらの署名を確認するには:

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形式に変換できます。

25
Tom Anderson

@Tomの回答は私を始めるのに役立ちましたが、そのままでは機能しませんでした。

これらのコマンドは、次のもので動作します。

  • OpenSSL 1.0.1 2012年3月14日
  • OpenSSH_5.9p1

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は任意の大きなファイルに署名できます。

11
stephen.z