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


36

私はSSH(正確にはLinux上のOpenSSH 5.5p1)を使用します。キーがあり、その上にパスフレーズがあります。私はこれを通常のコンピューターへのログインに使用します。

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

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

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


OpenSSH はdatプロトコルとしてEd25519を使用していませんか?単なるツールの問題のようです。
パブロA

回答:


24

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。いくつかのオプションがありますが、理想的なものはありません。

5.6以降のOpenSSHのバージョンを使用している場合、明らかにこれを行うことができます。

ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem

OpenSSLが読み取れるPEM形式で標準出力に公開キーを書き込みます。

秘密鍵があり、それがRSA鍵である場合、そこから公開鍵を抽出できます(公開鍵を導出することはできないため、PEMエンコードされた秘密鍵ファイルには公開鍵のコピーが含まれていると想定します秘密鍵自体から)、それを使用します:

openssl rsa -in ~/.ssh/id_rsa -pubout

DSAに相当するものがあるかどうかはわかりません。このアプローチでは、秘密鍵の所有者の協力が必要であることに注意してください。所有者は公開鍵を抽出し、検証者に送信する必要があります。

最後に、Larsという名前のチャップによって作成されたPythonプログラムを使用し、公開鍵をOpenSSHからOpenSSL形式に変換できます。


1
「秘密鍵自体から公開鍵を導出することはできません」というのは真実ではないことに注意したいだけです。実際には(つまり、実際に使用されるすべての暗号システムで)公開鍵は、ほとんどの場合、秘密鍵から簡単に導出されます。
キレラギン14

@kirelagin:それを知りませんでした。それを行う方法についての詳細を教えてください、またはリンクしてください。
トムアンダーソン14

1
このトピックに関する特定の読書があるかどうかはわかりません…考えてみましょう。個別のログベースの暗号化システム(ElGamal)を使用します。この場合、秘密鍵は(グループサイズ、ジェネレーター、電力)で、公開鍵は(グループサイズ、ジェネレーター、発電機^電力)です。したがって、ログは困難ですが、パワーはそうではありません、あなたはそれを計算します。
キレラギン14

RSAの場合、この反転は実際には困難ですが、ここでは状況が少し異なります。公開鍵は(n、d)であり、秘密鍵は(n、d ^(-1)mod phi(n))です。phi(n)を保存していない場合、dを反転することも困難ですが、ここにトリックがあります:ほとんどの人はe = 65537を使用します(キーを生成するとき、このデフォルトを変更するオプションがありますが、私は見たことがありません実用的な意味をなさないため、誰でも使用できます)、公開鍵を秘密鍵から導出するのは簡単です。
キレラギン14

楕円曲線を使用すると、実際には離散対数と電力の場合と同じであり、反転は簡単です。そうは言っても、他の暗号システムについてはわかりませんが、実際に使用されるのはこれら3つです。
キレラギン14

10

@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は結果に署名する前にダイジェストを取るため、任意の大きなファイルに署名できます。


私にとっても、Stephen.zの答えはそのまま使用できました。最初に私はしばらくの間トムの答えで遊んでいたが、最終的にStephen.zの答えが私にとって完璧に機能することがわかった。Stephen.zに感謝します!
グジェゴシWierzowiecki

PSここでスニペットを共有しました:gist.github.com/gwpl/2c7636f0b200cbfbe82cc9d4f6338585
Grzegorz Wierzowiecki

ファイルのハッシュのみに署名するためにpkeyutlを使用しようとしましたか?
ガイア

-3

これらの署名を検証するには -より簡単な解決策:

署名されたドキュメントが同じであることを確認する簡単な方法は、デジタル署名ファイルを再生成し、diffを使用して2つの署名ファイルが同じかどうかを確認することです。


3
あなたは署名ではなくハッシュを考えています。同様ですが、同じではありません:ハッシュは、ファイルが変更されなかったことを確認するだけです。署名は、それがどこから来たかを検証します。
Piskvor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.