Ubuntuのコマンドラインツールと自分のキーでファイルに署名する方法は?


14

私が書いたいくつかのPythonコードファイルに署名したいのは、それらが私のプロジェクトの1つのプラグインモジュールだからです。それを配布するために、ユーザーはプラグインが検証済みで安全であることを確認できるようにします(私または信頼する誰かによって作成されたため)。

このソフトウェアはオープンソースの趣味のプロジェクトに過ぎないため、公式の証明書を購入するためにお金を使いたくありません。代わりに、メインプログラムは常に有効であり、追加の検証なしで信頼できると想定しています。誰かが私のGitHubリポジトリ以外の場所からそれをダウンロードした場合、それは彼らのせいです。

私が読んだものから、署名は通常、非対称キーペアを作成し、コードファイルから強力な暗号化ハッシュ値(SHA-512など)を計算し、秘密鍵を使用してハッシュを暗号化し、その署名を別のファイルに保存することによって行われます元のコードファイルとともに出荷されます。
メインプログラムは、メインプログラムのソースコードにプレーンテキストで保存されている公開キーを使用して署名を解読し、コードファイルの同じハッシュ関数を計算し、それを解読されたものと比較する必要があります。一致する場合、プラグインは信頼できます。

だから今私の質問:

Ubuntuツールで強力な非対称キーペアを簡単に作成する方法と、ファイルの暗号化ハッシュ値を簡単に計算するにはどうすればよいですか?
スクリプトで署名プロセスを自動化する(常に同じキーを使用する)のは素晴らしいことです。

回答:


19

この回答の多くは、Arch WikiGnuPGのドキュメントからはぎ取られています。この回答の推奨事項はすべて純粋に私の意見であり、1トンの塩分で摂取する必要があります。

PGPキーの作成

GUI

  1. 開き、パスワードや鍵のアプリを(別名seahorse)、およびクリック+(またはに行くファイル - > 新規作成、またはプレスCtrlN)を参照します:

    タツノオトシゴの新しいアイテムダイアログ

  2. PGPキーを選択して、詳細を入力します。バイトコマンダーになりすましています:

    キー詳細ダイアログ

    RSAおよび2048ビットは、ほとんどの目的に適しています。署名にのみ使用する場合は、ドロップダウンメニューからRSA(署名のみ)オプションを選択しますが、必要はありません-これはサブキーを使用して処理できます。コメントを残すことができます。キーの有効期限を保持することも役立ちます。をクリックしCreateます。

  3. 適切な長さのパスワードを入力し(そして、長い、つまり私の例は短い、IMO)、クリックしますOk

    パスワード入力ダイアログ

    CLIとは異なり、タツノオトシゴにはフィードバックがないようです。エントロピーを収集してキーを作成している間、やりたいことを何でもしてしばらく待ってください。しばらく時間がかかる場合があります。その後、PGP Keysセクションにキーが表示されます:

    pgpキーのリスト

CLI

コマンドラインからキーを生成するには、単に実行しgpg --gen-keyます。GUIが行ったのと同じ詳細を尋ねます:

$ gpg --gen-key 
gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tuesday 27 September 2016 03:45:19 PM IST
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and E-mail Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Byte Commander
E-mail address: byte@command.er
Comment: 
You selected this USER-ID:
    "Byte Commander <byte@command.er>"

Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.

passphrase not correctly repeated; try again.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 186 more bytes)
.....+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 80 more bytes)
....+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 83 more bytes)
...+++++
gpg: key 8AE670A6 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2016-09-26
pub   2048R/8AE670A6 2015-09-28 [expires: 2016-09-27]
      Key fingerprint = 82D9 0644 B265 8E75 1E01  538B B479 3CF4 8AE6 70A6
uid                  Byte Commander <byte@command.er>
sub   2048R/0E2F4FD8 2015-09-28 [expires: 2016-09-27]

GnuPGがより多くのエントロピーが必要であることを教えてくれることに注意してください。タツノオトシゴもやりました。しかし、GnuPGはOliver Twistのように振る舞っているように感じます。:P

キーを公開する

ここで、公開キーを公開する必要があります。それにより、人々はそれを使用して物事を検証できます。

GUI

seahorseアプリのPGPキーのリストに戻ります(最後のスクリーンショットを参照)。エクスポートするキーを選択し、[ リモート ]メニューで[ キーの同期と公開 ]を選択します。

ここに画像の説明を入力してください

Syncあなたが公開するサーバーを選択していない場合、ボタンは無効になります。そのためには、Key Serversボタンをクリックしてください。

ここに画像の説明を入力してください

Ubuntuのサーバーを選びました。

これで、Syncボタンをクリックして、Ubuntuのキーサーバーに公開することができます(スパムについてはごめんなさい、Ubuntu!)。

CLI

CLIでは、公開するキーのキーIDが必要です。キーを作成するときの出力の最後の行です(8AE670A6)。それが何であるか覚えていない場合は、単に実行してくださいgpg --list-keys。公開するには:

$ gpg  --keyserver pgp.mit.edu --send-keys 8AE670A6
gpg: sending key 8AE670A6 to hkp server pgp.mit.edu

申し訳ありません、MIT

署名

ドキュメントに署名するための便利なGUIメソッドはまだ知りません。

署名するファイルを作成したら、ターミナルに移動します。試してくださいgpg --list-keys

$ gpg --list-keys       
/home/muru/.gnupg/pubring.gpg
---------------------------
pub   2048R/F7878B0C 2015-09-28 [expires: 2016-09-26]
uid                  Byte Commander <byte@command.er>
sub   2048R/345B9A4F 2015-09-28 [expires: 2016-09-26]

次の2つの方法を使用してファイルに署名できます。

暗号化を使用した署名

$ gpg --sign --output examples.sig examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

gpg: Invalid passphrase; please try again ...

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

デスクトップセッションを使用している場合は、グラフィカルなパスワードプロンプトが表示される可能性があります。たとえば、GNOMEの場合:

ここに画像の説明を入力してください

受信者が公開鍵を持っている場合、受信者はそれを検証するか、復号化されたコンテンツを取得できます。

$ gpg --verify examples.sig
gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"
$ gpg --decrypt examples.sig
[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"

平文で署名する

たとえば、メールを送信するときなど、コンテンツを暗号化したくない場合があります。その場合、次の--clearsignオプションを使用します。

$ gpg --clearsign examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ cat examples.desktop.asc 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJWCRAaAAoJEGUZkqX3h4sMBWsH/1yw+G0v5Ck+T3PBS90SkvC8
5C0FJeGVr0AgYQohhsE3zEGQ7nn53N7JsvNlF6VccvN99DZIp18JbrJ+qs5hWjtg
KU/ACleR5dvVrJgfjppkuC8Q3cAudvqciKlLjA7Xycr3P49oCNCy8k/ue2TrgCvS
mMb5IS/kqpO7wrOMBAR0c/2CjQsA91S1/YK7DbuUqeNgEzW1grsI7XZPhiDGpAib
D20HWrbdLhklAEJuo1EvuOIggW6MF6ksxDoVapsUzQalD0TWEq6OnvzIS5qhITrc
XaDPQJpiHyCyINnL5aZCUwr2uon7osJ+2a8Ahp1REpzIZTdND9jA5NWSel5+yAs=
=ZrtB
-----END PGP SIGNATURE-----

署名用の別個のファイルを使用した署名(分離署名)

最後に、一部のファイルでは、ドキュメントに署名を含めることができません。たとえば、パッケージファイルまたはリポジトリのメタデータには、両方とも埋め込み署名を簡単に許可しない特定の性質のコンテンツがあります。この場合、--detached-sigオプションを使用します。

$ gpg --output examples.desktop.sig --detach-sign examples.desktop

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ gpg --verify examples.desktop.sig examples.desktop
gpg: Signature made Monday 28 September 2015 03:35:55 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"

注意

暗号化+署名および分離署名では、の出力gpgはバイナリです。GnuPGは、--armorオプション(ASCII-armoured)を使用してbase64エンコードデータを出力できます。

オートメーション

署名をスクリプト化するには、次のようにします。

  • キーに空のパスフレーズを使用します
  • GnuPGのバージョンに応じて、パスフレーズをを介して送信しstdinます。いくつかのオプションについては、このUnix&Linuxの投稿を参照してください。

非常に素晴らしく詳細な答え。しかし、あなたが作成したキーの例について...私の仮名の未使用のキーのセットが周りにあるという事実に私があまりに満足しているかどうかはわかりません。後でその名前で実際のキーを作成して使用したい場合、それらを検索する人は混乱するかもしれません。サンプルキーと実際のキーは、メールアドレスが異なるため共存できるため、異なるIDを取得できると思いますが、それでも...これらのキーを再度削除することは可能ですか?
バイトコマンダー

@ByteCommanderという用語はrevokeです。それらの取り消しを検討します。さらに、キーの取り消しに関するセクションを追加する必要があります。
ムル

@ByteCommander申し訳ありませんが、公開したキーを削除しました(また、失効証明書を作成していなかったため(n00bの典型的な間違い)。そのため、そのキーを取り消すことはできません。混乱は1年で解決されます
muru

さて、まあ-それは起こります。私がイライラするべきか、その愚かな間違いについて笑うべきかわからない...問題のプロジェクトではrsa、すべてのGPGに苦労せずにデータに簡単に署名できるPythonモジュールを使用するだけだと思います。これは、ソフトウェアの公開とパッケージ化を実際に開始すると非常に便利になる可能性がありますが、現時点ではおそらく私の目的には多すぎます。そのため、それまではおそらく期限切れです!:)
バイトコマンダー

両方とも@ByteCommanderだと思う。キーを作成するときに実際の名前を使用し、コメントフィールドにはニックネームを残すことをお勧めします。
ムル

4
  1. gpgで非対称キーを作成します

    gpg --gen-key
    
  2. gpgを使用してファイルに署名します(秘密鍵が使用されます)

    gpg --output foo.sig --detach-sig foo.py
    
  3. 署名ファイルをテストします(公開鍵が使用されます)

    gpg --verify foo.sig foo.py
    

    出力例

    % gpg --verify foo.sig foo.py 
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: Good signature from "Your Name <your.name@host.com>"
    
    % echo "bad" >> foo.py
    
    % gpg --verify foo.sig foo.py
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: BAD signature from "Your Name <your.name@host.com>"
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.