GPGを使用してメッセージを暗号化および署名する方法

前書き

GPG、またはGNUプライバシーガードは、公開キー暗号化の実装です。 これにより、関係者間で情報を安全に送信でき、メッセージの発信元が本物であることを確認するために使用できます。

このガイドでは、GPGの仕組みと実装方法について説明します。 このデモではUbuntu 16.04サーバーを使用しますが、他のディストリビューションの手順も含まれます。

公開キー暗号化の仕組み

多くのユーザーが直面する問題は、安全に通信し、通話相手の身元を確認する方法です。 この質問に答えようとする多くのスキームは、少なくともある時点で、安全でない媒体を介したパスワードまたは他の識別資格情報の転送を必要とします。

意図されたパーティのみが読めるようにする

この問題を回避するために、GPGは公開キー暗号化と呼ばれるセキュリティ概念に依存しています。 アイデアは、送信の暗号化段階と復号化段階を2つの別々の部分に分割できるということです。 これにより、暗号化解除部分を保護している限り、暗号化部分を自由に配布できます。

これにより、誰でも作成および暗号化できる一方向のメッセージ転送が可能になりますが、指定されたユーザー(復号化秘密鍵を持つユーザー)のみが復号化できます。 両者が公開/秘密キーのペアを作成し、お互いに公開暗号化キーを与えると、両者はお互いにメッセージを暗号化できます。

したがって、このシナリオでは、各当事者が独自の秘密鍵と他のユーザーの公開鍵を持っています。

送信者の身元を検証する

このシステムのもう1つの利点は、メッセージの送信者が秘密鍵でメッセージに「署名」できることです。 受信者が持っている公開鍵を使用して、指定されたユーザーによって署名が実際に送信されていることを確認できます。

GPGキーを設定する

GPGは、ほとんどのディストリビューションでデフォルトでインストールされます。

何らかの理由でGPGが* Ubuntu および Debian *にインストールされていない場合、次のように入力してローカルリポジトリインデックスを更新し、インストールできます。

sudo apt-get update
sudo apt-get install gnupg
  • CentOS *では、次のように入力してGPGをインストールできます。

sudo yum install gnupg2

GPGを使用して通信を暗号化するには、キーペアを作成する必要があります。 これを行うには、次のコマンドを発行します。

gpg --gen-key

これにより、キーを設定するためのいくつかの質問が表示されます。

  • 必要なキーの種類を選択してください:(1)RSAおよびRSA(デフォルト)

  • どのキーサイズが必要ですか? * 4096 *

  • キーは有効ですか? * 1y *(1年後に失効します。 単にテストしている場合は、代わりに「3」などの数字を使用して、短命のキーを最初に作成することができます。

  • これは正しいです? y

  • 本名:ここに本名

  • メールアドレス:[email protected]

  • コメント:署名に表示されるオプションのコメント

  • (N)ame、©omment、(E)mail、または(O)kay /(Q)uit? O

  • パスフレーズを入力:ここに安全なパスフレーズを入力します(大文字と小文字、数字、記号)

この時点で、 `+ gpg +`はエントロピーを使用してキーを生成します。 _Entropy_は、システムに存在する予測不能性と非決定性の量を表します。 GPGは安全なキーのセットを生成するためにこのエントロピーを必要とします。

このプロセスは、システムのアクティブ度と選択したキーサイズによっては時間がかかる場合があります。 追加のエントロピーをより簡単に生成するには、https://www.digitalocean.com/community/articles/how-to-setup-additional-entropy-for-cloud-servers-using-haveged [havegedというツールを使用]を使用できます。 新しいターミナルを開き、サーバーに再度SSHで接続して、サーバーに「+ haveged +」を設定します。

失効証明書を作成する

セキュリティ違反が発生した場合、または秘密鍵を紛失した場合に、鍵ペアを無効にする方法が必要です。 GPGソフトウェアでこれを行う簡単な方法があります。

これは、必要なときではなく、キーペアを作成したらすぐに実行する必要があります。 この失効キーは事前に生成され、コンピューターが危険にさらされたり操作不能になったりした場合に備えて、安全な別の場所に保管する必要があります。 失効キーを生成するには、次を入力します。

gpg --output ~/ --gen-revoke

失効キーの作成を確認するように求められ、失効する理由を尋ねられます。 失効が将来使用される場合、この情報は他のユーザーに表示されます。 使用可能なオプションのいずれかを選択できますが、これは事前に行われているため、詳細はありません。 多くの場合、最大限の柔軟性を得るために、可能性のあるシナリオごとに失効証明書を作成することをお勧めします。

その後、コメントを入力し、最後に選択を確認するよう求められます。 失効証明書を作成する前に、GPGキーのパスフレーズを入力して本人確認を行う必要があります。 失効証明書は、 +-output +`フラグ(この例では `+ revocation.crt +)で指定されたファイルに書き込まれます。

OutputRevocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

不正なアクセスを防ぐために、生成された証明書ファイルのアクセス許可をすぐに制限する必要があります。

chmod 600 ~/

失効証明書は、他のユーザーがキーを失効できないように安全に保たれる必要があります。 メッセージに示されているように、証明書を適切に保護できる限り、証明書を他のマシンにバックアップして印刷することを検討する必要があります。

他のユーザーの公開鍵をインポートする方法

GPGは、通信したい人から他の公開鍵を受け入れることができなければ、役に立たないでしょう。

さまざまな方法で誰かの公開鍵をインポートできます。 テキストファイルで誰かから公開鍵を取得した場合、GPGは次のコマンドで公開鍵をインポートできます。

gpg --import

また、通信する相手が公開鍵サーバーに鍵をアップロードしている可能性もあります。 これらのキーサーバーは、世界中の人々の公開鍵を格納するために使用されます。

情報を他のさまざまなサーバーと同期する一般的なキーサーバーは、MIT公開キーサーバーです。 Webブラウザでここにアクセスすると、名前またはメールアドレスでユーザーを検索できます。

https://pgp.mit.edu/

次を入力して、GPG内からキーサーバーを検索することもできます。

gpg --keyserver pgp.mit.edu  --search-keys

名前または電子メールアドレスで検索するこの方法を使用できます。 プロンプトに従って、見つかったキーをインポートできます。

キーを検証および署名する方法

生成された公開鍵ファイルを自由に配布でき、人々はこれを使用して安全な方法であなたに連絡することができますが、鍵が最初の公開鍵送信中にあなたが考える人のものであると信頼できることが重要です。

他の人の身元を確認する

あなたが公開鍵を与えた人が彼らが誰だと言っているのかをどのように知っていますか? 場合によっては、これは簡単かもしれません。 ノートパソコンを開いたまま、鍵を交換している人の隣に座っている場合があります。 これは、正しい正当なキーを受け取っていることを識別するための非常に安全な方法です。

しかし、そのような個人的な連絡が不可能な多くの他の状況があります。 あなたは相手を個人的に知らないかもしれませんし、物理的な距離で隔てられているかもしれません。 安全でないチャネルを介して通信したくない場合、公開鍵の検証に問題が生じる可能性があります。

幸いなことに、両当事者の公開鍵全体を検証する代わりに、これらの鍵から派生した「指紋」を単純に比較できます。 これにより、両方が同じ公開鍵情報を使用しているという合理的な保証が得られます。

次のように入力して、公開キーのフィンガープリントを取得できます。

gpg --fingerprint
Outputpub   4096R/311B1F84 2013-10-04
     Key fingerprint =
uid                  Test User <[email protected]>
sub   4096R/8822A56A 2013-10-04

これにより、比較しやすい数値の文字列が生成されます。 この文字列をその人自身、またはその人にアクセスできる他の人と比較できます。

彼らの鍵に署名する

キーに署名すると、提供されたキーを信頼し、それが問題の人物に関連付けられていることを確認したことをソフトウェアに伝えます。

インポートしたキーに署名するには、次を入力します。

gpg --sign-key

鍵に署名すると、その人が本人であると信頼していることを確認することを意味します。 これは、他の人がその人も信頼するかどうかを判断するのに役立ちます。 誰かがあなたを信頼していて、あなたがこの人の鍵に署名したことを知った場合、その人も自分の身元を信頼する可能性が高くなります。

署名する鍵を送り返すことで、あなたが署名している鍵を持つ人が信頼関係を利用できるようにする必要があります。 これを行うには、次のように入力します。

gpg --output ~/ --export --armor

パスフレーズをもう一度入力する必要があります。 その後、あなたが署名した公開鍵が表示されます。 これを送信して、他の人とやり取りするときに「承認のスタンプ」を取得することで利益を得られるようにします。

この新しい署名済みキーを受け取ったら、インポートして、生成した署名情報をGPGデータベースに追加できます。 次のように入力してこれを行うことができます。

gpg --import ~/

彼らは自分の身元が正しいことを_あなたが信頼していることを他の人に示すことができます。

公開キーを高可用性にする方法

公開キー暗号化の設計方法により、未知の人があなたの公開キーを持っている場合に発生する可能性のある悪意はありません。

これを念頭に置いて、公開鍵を公開することは有益です。 人々はあなたの情報を見つけて、最初のやり取りから安全にメッセージを送信できます。

GPGシステムから公開鍵を要求することにより、誰でも公開鍵を送信できます。

gpg --output ~/ --armor --export
Output-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

その後、このファイルを適切な媒体を介して相手に送信できます。

キーサーバーにキーを公開する場合は、ほとんどのサーバーサイトで利用可能なフォームを使用して手動で公開できます。

別のオプションは、GPGインターフェイスを介してこれを行うことです。 次のように入力して、キーIDを検索します。

gpg --list-keys

以下の出力で強調表示されている部分はキーIDです(どちらを使用するかわからない場合は、左側の列に沿って「+ pub」を探してください)。 キーを内部ソフトウェアに参照する簡単な方法です。

Outputpub   4096R/ 2013-10-04
uid                  Test User <[email protected]>
sub   4096R/8822A56A 2013-10-04

特定のキーサーバーにキーをアップロードするには、次の構文を使用できます。

gpg --send-keys --keyserver pgp.mit.edu

キーは指定されたサーバーにアップロードされます。 その後、世界中の他の主要サーバーに配布される可能性があります。

GPGを使用したメッセージの暗号化と復号化

相手と鍵を共有した後、メッセージを簡単に暗号化および復号化できます。

メッセージを暗号化する

GPGの「–encrypt」フラグを使用してメッセージを暗号化できます。 基本的な構文は次のとおりです。

gpg --encrypt --sign --armor -r

これにより、受信者の公開鍵を使用してメッセージが暗号化され、自分から送信されたことを保証するために独自の秘密鍵で署名し、生のバイトではなくテキスト形式でメッセージを出力します。 ファイル名は入力ファイル名と同じですが、拡張子が「+ .asc +」になります。

暗号化されたメッセージを読むことができるようにしたい場合は、自分のメールアドレスを持つ2番目の「-r」受信者を含める必要があります。 これは、メッセージが各個人の公開鍵で暗号化され、関連付けられた秘密鍵でのみ復号化できるためです。

したがって、相手の公開鍵でのみ暗号化されている場合、何らかの方法で秘密鍵を取得しない限り、メッセージを再度表示することはできません。 2番目の受信者として自分自身を追加すると、メッセージは受信者ごとに1回ずつ、別々に2回暗号化されます。

メッセージを解読する

メッセージを受信したら、メッセージファイルでGPGを呼び出すだけです。

gpg .asc

ソフトウェアは必要に応じてプロンプトを表示します。

ファイルの代わりに生のテキストストリームとしてメッセージがある場合は、引数なしで `+ gpg +`を入力した後にコピーして貼り付けることができます。 「CTRL-D」を押してメッセージの終わりを示すことができ、GPGはそれを解読します。

キーメンテナンス

鍵データベースを管理するために定期的に使用する必要がある多くの手順があります。

他の人から入手した利用可能なGPGキーをリストするには、次のコマンドを発行できます。

gpg --list-keys

公開キーサーバーから取得した情報に依存している場合、キー情報が古くなる可能性があります。 失効したキーに依存することは望ましくありません。これは、潜在的に侵害されたキーを信頼していることを意味するためです。

以下を発行することにより、キー情報を更新できます。

gpg --refresh-keys

これにより、キーサーバーから新しい情報が取得されます。

次を使用して、特定のキーサーバーから情報をプルできます。

gpg --keyserver  --refresh-keys

キーがキーサーバーで見つからない場合、エラーメッセージが表示される場合があります。

結論

GPGを正しく使用すると、さまざまな人とのコミュニケーションを保護できます。 これは、特に機密情報を処理する場合だけでなく、定期的な日常のメッセージングを処理する場合にも非常に役立ちます。

監視プログラムによって特定の暗号化通信にフラグを立てることができるため、「秘密」データだけでなく、すべてに暗号化を使用することをお勧めします。 これにより、重要なデータを送信しているときや友好的な挨拶を送信しているときを人々が知るのが難しくなります。

Related