こんにちは。よっしーです(^^)
今日は、GPG についてご紹介します。GitHubを利用する際に署名を利用したので、その時の共有になります。
GPGとは
GPGは、PGP(Pretty Good Privacy)のフリーソフトウェア版として開発されました。PGPは、暗号化とデジタル署名のためのソフトウェアであり、1980年代後半に登場しました。しかし、PGPは商用ソフトウェアであったため、GPL(GNU General Public License)に基づいたオープンソースの代替品としてGPGが開発されました。
GPGは、OpenPGP規格に準拠しています。OpenPGPは、PGPのオープンスタンダード版であり、RFC(Request for Comments)によって定義されています。OpenPGPは、メッセージの暗号化や電子署名を行うための標準化されたフォーマットを定めており、これに従ってGPGはメッセージやファイルを処理します。
GPGの主な機能には、以下のものがあります。
- 暗号化:メッセージやファイルを暗号化することができます。秘密鍵を保持している人だけが、暗号化されたメッセージやファイルを復号することができます。
- 電子署名:メッセージやファイルに電子署名を作成することができます。これにより、署名されたメッセージやファイルが改ざんされていないことを確認できます。
- 鍵管理:GPGを使用するためには、鍵ペアを生成する必要があります。鍵ペアには、秘密鍵と公開鍵が含まれています。秘密鍵は保護されるべき情報であり、公開鍵は他の人に配布することができます。
- 認証:GPGは、鍵ペアによる認証機能を備えています。これにより、メッセージの送信者が本当にその人であることを確認できます。
GPGは、コマンドラインツールとして提供されていますが、GUIアプリケーションを使用することもできます。GPGは、LinuxやmacOS、Windowsなどのさまざまなプラットフォームで利用できます。また、GPGは、多くのアプリケーションに統合されており、メールクライアントやファイルマネージャなどで利用することができます。
GPGのインストール
下記のコマンドでGPGがインストールされているかどうかを確認します。
gpg --version
バージョンが表示されていればインストールされています。
ちなみに、自分の環境では下記でした。
% gpg --version
gpg (GnuPG) 2.4.0
libgcrypt 1.10.1
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /Users/xxx/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
もし、バージョンが表示されなければ、下記のコマンドで pgpをインストールしましょう。
brew install gpg
GPGのマスタキーとサブキー
GPGでは、公開鍵暗号方式を使用して、データの暗号化や電子署名を行います。公開鍵暗号方式では、秘密鍵と公開鍵の2つの鍵があり、秘密鍵で暗号化したデータは、公開鍵でしか復号できず、公開鍵で暗号化したデータは、秘密鍵でしか復号できません。このため、秘密鍵は絶対に漏洩させてはいけません。
GPGでは、マスターキーとサブキーの2つの鍵があります。マスターキーは、GPG鍵ペアの根幹をなす鍵であり、秘密鍵と公開鍵の両方を含みます。一度生成したら変更することができません。マスターキーは、サブキーを作成するために使用され、自己署名されているため、信頼されたルートとして機能します。
一方、サブキーは、マスターキーによって署名された鍵であり、一定の期間後に期限切れになるように設定できます。サブキーは、通常はマスターキーに関連した暗号化や電子署名などの特定の機能に使用されます。例えば、電子メールの署名に使用するサブキーを生成することができます。
サブキーは、秘密鍵と公開鍵の両方を含みますが、秘密鍵が暗号化されているため、必要に応じて暗号化パスワードで保護されます。サブキーは、マスターキーによって署名されているため、信頼性があります。
マスターキーとサブキーを分離することで、セキュリティを強化することができます。また、サブキーを使用することで、必要に応じてマスターキーをオフラインに保管することができます。
GPGのKey-Usage
GPGでは、Key-Usageというパラメータを指定することで、鍵の使用目的を制限することができます。以下に、GPGにおける主なKey-Usageの種類を示します。
- Certify(証明) このKey-Usageは、公開鍵を署名するために使用されます。この鍵によって署名された公開鍵は、信頼できるものとして扱われます。
- Sign(署名) このKey-Usageは、データに署名するために使用されます。署名されたデータは、署名者によって正当性が保証されたものとして扱われます。
- Encrypt(暗号化) このKey-Usageは、データを暗号化するために使用されます。暗号化されたデータは、鍵を持つ人以外には読み取ることができません。
- Authenticate(認証) このKey-Usageは、鍵の所有者が認証するために使用されます。これにより、データを送信する相手が正当なものであることを確認できます。
これらのKey-Usageは、単独または複数の組み合わせで使用することができ、鍵のセキュリティを強化することができます。例えば、証明と署名のKey-Usageがある鍵は、他の人の公開鍵を署名するだけでなく、データに署名することができます。一方、暗号化のKey-Usageがある鍵は、データを暗号化することができますが、他の人の公開鍵を署名することはできません。
鍵の作成
この記事では、鍵の使用目的に応じて、下記の4つの鍵を作成します。
- Certify(証明)用のマスタキー
- Sign(署名)用のサブキー
- Encrypt(暗号化)用のサブキー
- Authenticate(認証) 用のサブキー
Certify(証明)用のマスタキー
下記のコマンドで作成します。
% export GNUPGHOME="$(mktemp -d)"
% cat >gen-key.conf <<EOF
%echo Generating a basic OpenPGP key
Key-Type: eddsa
Key-Curve: Ed25519
Key-Usage: cert
Name-Real: # 鍵の所有者の名前
Name-Comment: # 任意のコメント
Name-Email: # 鍵の所有者のメールアドレス
Expire-Date: 0
Passphrase: # パスフレーズ
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOF
% gpg --batch --generate-key gen-key.conf
Name-Real
GPGにおけるName-Realは、公開鍵の作成時に設定される、鍵所有者の本名を表すフィールドです。Name-Realには、鍵所有者の本名を入力することが推奨されています。ただし、任意の文字列を入力することができます。
Name-Realは、公開鍵が作成されたときの情報を保持しています。このため、鍵所有者が本名を変更した場合、公開鍵のName-Realを変更する必要があります。
また、Name-Realは、公開鍵が信頼できるものであることを確認するために使用されることがあります。たとえば、Web of Trust(信頼のネットワーク)の構築時には、公開鍵を持つ人物の本名が確認され、その人物が信頼できると判断された場合に限り、その公開鍵が信頼できるとみなされます。このため、Name-Realには、本名を正確に記載することが重要です。
なお、GPGでは、Name-Real以外にも、Name-EmailやCommentといったフィールドがあります。これらのフィールドは、鍵所有者のメールアドレスやコメントなど、さまざまな情報を保持するために使用されます。
Name-Comment
GPGにおけるName-Commentは、公開鍵の作成時に設定される、鍵所有者に関するコメントを表すフィールドです。Name-Commentには、任意の文字列を入力することができます。
Name-Commentは、公開鍵の情報を補足するために使用されます。たとえば、鍵所有者が同じ名前を持つ複数の鍵を作成する場合、それぞれの鍵にName-Commentを付けて区別することができます。また、Name-Commentには、鍵の作成目的や使用用途などの情報を記述することもできます。
GPGでは、Name-RealやName-Emailと同様に、Name-Commentも公開鍵の信頼性を確認するために使用されることがあります。たとえば、Web of Trustの構築時には、鍵所有者が公開鍵の情報にコメントを付けているかどうかも確認されます。
なお、Name-Commentは、必須ではありません。つまり、公開鍵の作成時にName-Commentを空欄にしても問題ありません。
Passphrase
GPGにおけるPassphrase(パスフレーズ)とは、秘密鍵を保護するためのパスワードのことです。秘密鍵には、暗号化したメッセージの復号化や署名の作成など、重要な操作が含まれるため、秘密鍵の安全性は非常に重要です。Passphraseは、秘密鍵を保護するために使用されます。
Passphraseは、公開鍵暗号化方式で暗号化された秘密鍵を復号化するために必要です。また、秘密鍵を使用するためには、Passphraseを入力する必要があります。つまり、Passphraseが正しく入力されない限り、秘密鍵を使用することはできません。
Passphraseは、できるだけ複雑なパスワードを使用することが推奨されます。また、Passphraseを定期的に変更することも重要です。これにより、秘密鍵を保護するためのセキュリティレベルを高めることができます。
なお、Passphraseを設定しなかった場合、秘密鍵は暗号化されずに保存されるため、誰でも秘密鍵を使用することができるようになってしまいます。したがって、Passphraseを設定することは、GPGを安全に使用するために非常に重要です。
各サブキーの作成
下記の手順で各サブキーを作成します。
export KEYID="マスタキーのID"
# 署名用のサブキーを作成
gpg --batch --passphrase '署名用のパスフレーズ' --quick-add-key $KEYID ed25519 sign 1y
# 認証用のサブキーを作成
gpg --batch --passphrase '認証用のパスフレーズ' --quick-add-key $KEYID ed25519 auth 0
# 暗号化用のサブキーを作成
gpg --batch --passphrase '暗号化用のパスフレーズ' --quick-add-key $KEYID cv25519 encr 1y
各サブキーの動作確認
下記の手順で各サブキーの動作確認をします。
# 署名&認証の確認
echo "gpg sign test" > test_sign.txt
gpg -u $KEYID -s test_sign.txt
gpg --verify test_sign.txt.gpg
# 暗号化の確認
echo "gpg encr test" > test_encr.txt
gpg -e -r $KEYID test_encr.txt
gpg -d test_encr.txt.gpg
バックアップ
下記の手順でバックアップをとります。mastersub.key は、どこか安全な場所に保存して、PCからは削除しておくとよいです。
# バックアップ
gpg -a -o mastersub.key --export-secret-keys $KEYID
gpg -a -o sub.key --export-secret-subkeys $KEYID
gpg -a -o public.asc --export $KEYID
失効証明書の作成
下記の手順で失効証明書を作成します。失効証明書は、秘密鍵の紛失や盗難などの場合に、公開鍵を無効化するために使用されます。失効証明書は、公開鍵を発行したキーペアの秘密鍵で署名されたファイルで、公開鍵を失効させる際に使用します。
# 失効証明書の発行
gpg -o revoke.asc --gen-revoke $KEYID
失効証明書の利用方法
失効証明書を使用して公開鍵を失効させるには、以下のコマンドを使用します。
gpg --import
revoke.asc
このコマンドを実行すると、失効証明書がインポートされ、公開鍵が失効されます。
作成した鍵の削除
下記の手順で作成した鍵を削除します。
gpg --delete-secret-keys $KEYID
サブキーのみインポート
別のターミナルを開いて、下記のコマンドでサブキーをインポートします。鍵一覧を表示すると、主鍵(sec)に#
(使用不可)がついているのが確認できます。
pushd #上記のコマンドを実施していたディレクトリ
gpg --import sub.key
% gpg -K
---------------------------------
sec# ed25519 2023-02-05 [C]
xxx
uid [ unknown] Name (Comment) <Email>
ssb ed25519 2023-02-05 [S] [expires: 2024-02-05]
ssb ed25519 2023-02-05 [A]
ssb cv25519 2023-02-05 [E] [expires: 2024-02-05]
pinentry-macのインストール
pinentry-mac
は、macOS環境でGnuPGを使用する際に、パスフレーズの入力を簡単にするためのアプリケーションです。通常、GnuPGで秘密鍵を使用する際には、パスフレーズを入力する必要がありますが、pinentry-mac
を使用することで、macOSのキーチェーンにパスフレーズを保存して自動入力することができます。
下記のコマンドでインストールと設定をします。
brew install pinentry-mac
cat ~/.gnupg/gpg-agent.conf
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
この設定により、GnuPGがパスフレーズを求める際に、pinentry-mac
が起動されます。
pinentry-mac
は、macOSのキーチェーンにパスフレーズを保存して、自動入力することができます。パスフレーズを保存するには、パスフレーズ入力画面で「Save in Keychain」オプションを選択し、キーチェーンに保存するパスワードを入力します。これにより、次回以降のパスフレーズ入力時には、自動的にキーチェーンからパスワードが取得され、入力されます。
pinentry-mac
は、パスフレーズの入力を簡単にするだけでなく、セキュリティも向上させます。パスフレーズがキーチェーンに保存されるため、ターミナルやコマンドラインでパスフレーズを入力する必要がなくなり、キーロガーによるパスフレーズの盗聴や、スクリーンショットによるパスフレーズの漏洩を防ぐことができます。
おわりに
今日は、gpg についてご紹介しました。あまり使用する場面はないかも知れませんが、GitHubでコミットを検証済みにするときの参考にしてみてください。
また明日お会いしましょう!
コメント