Skip to content

Instantly share code, notes, and snippets.

@matsueushi
Forked from denvernine/1.create-gpg-keys.md
Created May 4, 2023 07:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matsueushi/35edd317a2061ebe77507450d07eb39f to your computer and use it in GitHub Desktop.
Save matsueushi/35edd317a2061ebe77507450d07eb39f to your computer and use it in GitHub Desktop.
GPGキーを使ってGitHubにSSHで疎通確認、その後GPGキーを使った署名付きコミットをするまでのログ

GPGキーを作ってみよう

GPGキーを使ってGitHubにSSHで疎通確認、その後GPGキーを使った署名付きコミットをするまでのログです。

GPGってなに?

GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). GnuPG allows you to encrypt and sign your data and communications; it features a versatile key management system, along with access modules for all kinds of public key directories. GnuPG, also known as GPG, is a command line tool with features for easy integration with other applications. A wealth of frontend applications and libraries are available. GnuPG also provides support for S/MIME and Secure Shell (ssh).

The GNU Privacy Guard

ということで、RFC4880で規定されたOpenPGP標準規格を実装した、暗号化・署名を行うフリーソフトウェアです。

GPGは

  • gpg
  • gpgconf
  • gpgme-json
  • gpgparsemail
  • gpgrt-config
  • gpgsm
  • gpgsplit
  • gpgv
  • gpg-agent
  • gpg-connect-agent
  • gpg-error
  • gpg-error-config
  • gpg-wks-server
  • gpg-zip

など複数のソフトウェアで構成されています。大抵のディストリビューションでは /usr/bin/ にあると思います。

執筆時は2.3系が最新ですが、2.2系がLTSバージョンとなっていて、2024年12月31日までサポートされています。なおgpg 2.2.21と2.2.22、libgcrypt 1.9.1は公式で非推奨となっていますので注意してください。

準備

まずはgpgコマンドが使える状態にしてください。今回の例ではAlmaLinux 8.5/gpg 2.2.20/libgcrypt 1.8.5を使用します。またgpg 2.1以降、pinentryの利用(パスフレーズの入力に使用する)が必須となりましたので、これも使えるようにしておいてください。

# RedHat系
sudo yum install gnupg2 pinentry

次に .bashrc.profile などに以下を追記します。

GNUPGHOME="${HOME}/.gnupg"
export GNUPGHOME

GPG_TTY=$(tty)
export GPG_TTY

追記後 ${SHELL} -lsource ~/.bashrc. .profile などで再読み込みします。

${GNUPGHOME} ディレクトリを作成します。

mkdir -p ${GNUPGHOME}/private-keys-v1.d
chmod 0700 ${GNUPGHOME} && chmod 0700 ${GNUPGHOME}/private-keys-v1.d

最後に、現在gpg-agentが起動されているか確認します。単に gpg-agent で起動状態がわかります。

gpg-agent[3012123]: gpg-agent running and available

といった表示であれば現在起動中ですので、一度止めておきます。

gpgconf --kill gpg-agent

gpg.conf

gpgコマンドに渡すオプションを記載しておくファイルです。 ${GNUPGHOME}/gpg.conf として配置します。

一例を記載します。 personal-*-preferences に設定するアルゴリズムのリストは gpg --with-colons --list-config で得ることができます。gpg 2.2.20ではAEADに関する項目が表示されなかったのでコメントアウトしてあります。

cat > ${GNUPGHOME}/gpg.conf <<'EOF'
# キーIDを16文字で表示する
keyid-format long
# フィンガープリントを表示する
with-fingerprint
# キーグリップを表示する
with-keygrip
# 暗号化アルゴリズムのリスト
personal-cipher-preferences AES256 TWOFISH CAMELLIA256
# 認証付き暗号(Authenticated Encryption with Associated Data)に使用する暗号化アルゴリズムのリスト
#personal-aead-preferences EAX OCB
# メッセージダイジェストに使用するハッシュアルゴリズムのリスト
personal-digest-preferences SHA256 RIPEMD160
# 圧縮アルゴリズムのリスト
personal-compress-preferences ZIP ZLIB BZIP2
# バージョン情報を出力しない
no-emit-version
# パスフレーズ入力を呼び出し元(今回はシェル)にリダイレクトする
# 危険なパスフレーズでも警告なしに登録できてしまうので注意
#pinentry-mode loopback
EOF

gpg-agent.conf

gpg.conf と同じように、gpg-agentコマンドに渡すオプションを記載しておくファイルです。 ${GNUPGHOME}/gpg-agent.conf として配置します。

こちらも例を載せておきます。

cat > ${GNUPGHOME}/gpg-agent.conf <<'EOF'
# 最後にパスフレーズを入力してからのキャッシュTTL(秒)
default-cache-ttl 300
# ssh鍵に対して最後にパスフレーズを入力してからのキャッシュTTL(秒)
default-cache-ttl-ssh 300
# パスフレーズの最大キャッシュTTL(秒)
max-cache-ttl 3600
# ssh鍵のパスフレーズの最大キャッシュTTL(秒)
max-cache-ttl-ssh 3600
# パスフレーズの最短文字数
min-passphrase-len 8
# パスフレーズに英字以外を含める数
min-passphrase-nonalpha 0
# パスフレーズ入力プログラム指定する
#pinentry-program /usr/bin/pinentry
# ssh-agentの代わりにgpg-agentを使用するときは指定する
enable-ssh-support
EOF

GPGキーを作る

さて、いよいよ鍵の作成です。

今回はマスターキーに認証機能だけを持たせて、サブキーに署名・暗号化・証明機能を割り振ります。

作成方法は設定を逐次入力する対話モードと、事前に設定ファイルを作成するバッチモードがありますが、今回は対話モードで作成します。バッチモードについては別に簡単にまとめておきますので、興味があればそちらを参照してください。

マスターキー

楕円曲線暗号を利用します。またサブキーに必要な能力を割り振るので、マスターキー通常は利用しないかわりに有効期限を無期限とします。

gpg --full-gen-key --expert

コマンド入力後は対話的にキー作成を進めます。

楕円曲線暗号を利用するため11を選択し、能力の有無を自分で選択します。

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)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
   (9) ECC and ECC
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (13) Existing key
  (14) Existing key from card
Your selection? 11

署名能力の有無を切り替えて認証能力のみにします。

Possible actions for a ECDSA/EdDSA key: Sign Certify Authenticate
Current allowed actions: Sign Certify

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? s

Possible actions for a ECDSA/EdDSA key: Sign Certify Authenticate
Current allowed actions: Certify

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? q

楕円曲線の種類を選択します。今回はCurve 25519を使用します。

Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (9) secp256k1
Your selection? 1

有効期限を入力します。無期限にしたいので0です。

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) 0
Key does not expire at all
Is this correct? (y/N) y

GPGキーの持ち主の情報を入力します。適宜内容を変更してください。GitHubで使う場合はGitHubに登録しているメールアドレスである必要があります。

GnuPG needs to construct a user ID to identify your key.

Real name: sample
Email address: sample@example
Comment: 1

確認画面が表示されるので、問題なければO(大文字のオー)を入力します。小文字でも通ります。

You selected this USER-ID:
    "sample (1) <sample@example>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

パスフレーズを入力します。NISTによれば、

Memorized secrets SHALL be at least 8 characters in length if chosen by the subscriber.

(中略)

If the CSP or verifier disallows a chosen memorized secret based on its appearance on a blacklist of compromised values, the subscriber SHALL be required to choose a different memorized secret.

NIST Special Publication 800-63B

またGnuPGのメーリングリストでは以下のように言及されています。

I'd suggest:

L = (3N) / (10 * log S)

(中略)

Plugging in the numbers for Diceware and a 256-bit key:

L = (3 * 256) / (10 * log 7776)
L = 768 / (10 * 3.89)
L = 768 / 38.9
L = 19.74

Round it up to 20 words and call it done.

Length for AES256 symmetric encryption passphrase?

以上から8から20文字で危険でない(abcdやpasswordではない)単語の組み合わせがよいでしょう。

パスフレーズの入力が終わるとキーと失効証明書が作成されます。

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, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /home/${USER}/.gnupg/trustdb.gpg: trustdb created
gpg: key C781C1D6CC545538 marked as ultimately trusted
gpg: directory '/home/${USER}/gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/${USER}/.gnupg/openpgp-revocs.d/81E1FBCEC81AD4F229B6DB5FC781C1D6CC545538.rev'
public and secret key created and signed.

pub   ed25519/C781C1D6CC545538 2022-01-07 [C]
      Key fingerprint = 81E1 FBCE C81A D4F2 29B6  DB5F C781 C1D6 CC54 5538
      Keygrip = 1AD0F0EEA2B592906446A011BED9829142C3F943
uid                            sample (1) <sample@example.com>

署名用サブキー

gitコミットの署名使用するだけなら署名能力のあるサブキーだけで問題ありません。サブキーの作成方法はどの用途でも同じです。

マスターキーのキーID(今回は C781C1D6CC545538 )かuid(今回は sample@example.com )を指定します。

gpg --expert --edit-key C781C1D6CC545538

こちらも対話的に作成します。

キーを追加します。

gpg> addkey

マスターキーの作成時と同じように使用する暗号の種類等を選択します。今回は署名能力だけを持つキーを作りたいので、10を選択します

Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
  (14) Existing key from card
Your selection? 10

楕円曲線の種類を選択します。今回はマスターキーと同じCurve 25519を使用します。

Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (9) secp256k1
Your selection? 1

有効期限を入力します。

秘密鍵の有効期限とは少し話が変わりますが、Appleは2020年3月3日に「398日を超えるSSL/TLS証明書を信頼しない」という声明を出しました。

TLS server certificates issued on or after September 1, 2020 00:00 GMT/UTC must not have a validity period greater than 398 days.

About upcoming limits on trusted certificates - Apple Support

その後GoogleやMozillaといった主要なブラウザベンダーがこれに追従したことで、現在はSSL/TLS証明書の有効期限は1年になっていることが多いようです。

今回はこれに倣い、有効期限を1年にしておきます。

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 Sat 07 Jan 2023 11:19:01 AM JST
Is this correct? (y/N) y
Really create? (y/N) y

パスフレーズを入力します。マスターキーに設定したパスフレーズです。

パスフレーズが正しければサブキーが作成されます。

# ...
ssb  ed25519/09990DA502D268F0
     created: 2022-01-07  expires: 2023-01-07  usage: S
[ultimate] (1). sample (1) <sample@example.com>

認証用サブキー

署名用サブキーと同様に認証用サブキーを作成します。署名用サブキーと作成手順は同じですので、入力値が異なる部分だけ載せておきます。

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
  (14) Existing key from card
Your selection? 11

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Sign

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? a

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? s

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? q

作成されたキーは以下の通りです。

# ...
ssb  ed25519/0B515F3FEE8F39C8
     created: 2022-01-07  expires: 2023-01-07  usage: A
[ultimate] (1). sample (1) <sample@example.com>

今回は署名用と認証用のサブキーを作って終わりにしますので、ここで終了します。

gpg> save

バックアップ

一部のファイルは存在しないこともありますが、マニュアルによれば以下のファイルをバックアップしておくべきです。

  • gpg.conf
  • gpg-agent.conf
  • openpgp-revocs.d/
  • private-keys-v1.d/
  • pubring.gpg
  • pubring.kbx
  • sshcontrol
  • trustlist.txt

trustdb.gpgについては、以下のコマンドを使用することが推奨されています。出力先は適宜変更してください。

gpg --export-ownertrust > ${GNUPGHOME}/trustdb

また、GPGキーは以下の方法でもバックアップできます。

# 公開鍵
gpg --armor --export --output ${GNUPGHOME}/public-key.asc <uid>
# 秘密鍵
gpg --pinentry-mode loopback --armor --export-secret-keys --output ${GNUPGHOME}/secret-keys.asc <uid>

マスターキーの削除

バックアップが終わったらマスターキーを削除します。

まずマスターキーのキーIDを確認します。

gpg --list-secret-keys
# /home/${USER}/.gnupg/pubring.kbx
# ----------------------------------
# sec   ed25519/C781C1D6CC545538 2022-01-07 [C]
#       Key fingerprint = 81E1 FBCE C81A D4F2 29B6  DB5F C781 C1D6 CC54 5538
#       Keygrip = 1AD0F0EEA2B592906446A011BED9829142C3F943
# uid                 [ultimate] sample (1) <sample@example.com>
# ssb   ed25519/09990DA502D268F0 2022-01-07 [S] [expires: 2023-01-07]
#       Keygrip = 9466E3AFC6A4981ED9D6C422417373D37539D434
# ssb   ed25519/0B515F3FEE8F39C8 2022-01-07 [A] [expires: 2023-01-07]
#       Keygrip = D614E7980EA94F608EBF2EF1CC9E05FC4D75F537

キーIDの最後にエクスクラメーションマーク ! をつけて削除します。確認画面が出るので、キーIDがあっているか確認してください。

gpg --yes --delete-secret-keys C781C1D6CC545538!
gpg: WARNING: unsafe permissions on homedir '/home/rkitagawa/.gnupg/batch'
gpg (GnuPG) 2.2.20; Copyright (C) 2020 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.


sec  ed25519/C781C1D6CC545538 2022-01-07 sample example (sample comment) <sample@example.com>

Note: Only the secret part of the shown primary key will be deleted.

Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y

削除できたか確認を行います。 sec# のように、 # がついていれば削除できています。

gpg --list-secret-keys
# /home/${USER}/.gnupg/pubring.kbx
# ----------------------------------
# sec#  ed25519/C781C1D6CC545538 2022-01-07 [C]
#       Key fingerprint = 81E1 FBCE C81A D4F2 29B6  DB5F C781 C1D6 CC54 5538
#       Keygrip = 1AD0F0EEA2B592906446A011BED9829142C3F943
# uid                 [ultimate] sample (1) <sample@example.com>
# ssb   ed25519/09990DA502D268F0 2022-01-07 [S] [expires: 2023-01-07]
#       Keygrip = 9466E3AFC6A4981ED9D6C422417373D37539D434
# ssb   ed25519/0B515F3FEE8F39C8 2022-01-07 [A] [expires: 2023-01-07]
#       Keygrip = D614E7980EA94F608EBF2EF1CC9E05FC4D75F537

インポート

以下のようにしてインポートを行えます。

cp -R openpgp-revocs.d ${GNUPGHOME}/openpgp-revocs.d
cp -R private-keys-v1.d ${GNUPGHOME}/private-keys-v1.d
cp pubring.kbx ${GNUPGHOME}/pubring.kbx
gpg --import-ownertrust < trustdb

インポート後に gpg --list-secret-keys などで確認を行ってください。

また gpg --export --output ... で秘密鍵/公開鍵をエクスポートした場合は、以下の方法でもインポートすることができます( < は無くても構いません)。

gpg --import < {public-key}
gpg --import < {secret-keys}

SSHにGPGキーを使う

ssh-agentの代わりにgpg-agentを使ってSSH接続を行う

作成したキーを確認をかねてキーグリップの確認を行います。

gpg --list-secret-keys
# /home/${USER}/.gnupg/pubring.kbx
# ----------------------------------
# sec#  ed25519/C781C1D6CC545538 2022-01-07 [C]
#       Key fingerprint = 81E1 FBCE C81A D4F2 29B6  DB5F C781 C1D6 CC54 5538
#       Keygrip = 1AD0F0EEA2B592906446A011BED9829142C3F943
# uid                 [ultimate] sample (1) <sample@example.com>
# ssb   ed25519/09990DA502D268F0 2022-01-07 [S] [expires: 2023-01-07]
#       Keygrip = 9466E3AFC6A4981ED9D6C422417373D37539D434
# ssb   ed25519/0B515F3FEE8F39C8 2022-01-07 [A] [expires: 2023-01-07]
#       Keygrip = D614E7980EA94F608EBF2EF1CC9E05FC4D75F537

キーグリップを ${GNUPGHOME}/sshcontrol に記載します。今回は認証用サブキーを使用するので、認証用サブキーのキーグリップを記載します。

echo D614E7980EA94F608EBF2EF1CC9E05FC4D75F537 > ${GNUPGHOME}/sshcontrol

gpg-agentを起動します。

gpg-connect-agent /bye

環境変数 SSH_AUTH_SOCK をgpg-agentのものに設定します。

SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
export SSH_AUTH_SOCK

作成したサブキーが使える状態になっているか確認します。以下のコマンドで表示されるのは公開鍵情報です。

ssh-add -L
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID6mpshmAxm9j6F7f2hPCvah4yJgmgocA9mkXzbzEJDn (none)
gpg --export-ssh-key {uid}
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID6mpshmAxm9j6F7f2hPCvah4yJgmgocA9mkXzbzEJDn openpgp:0x9C8A499F

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID6mpshmAxm9j6F7f2hPCvah4yJgmgocA9mkXzbzEJDn をGitHubのSSH keysに登録します。

add ssh public key to github.com

GitHubに登録したSSH公開鍵は https://github.com/{username}.keys または https://api.github.com/users/{username}/keys で確認することができます。筆者が登録しているSSH公開鍵は、

で確認できます。

GitHubに公開鍵を登録できたら疎通確認を行います。

ssh -T git@github.com

gitコミットにGPG鍵で署名する

「ついでに」だったはずがSSHに関することばかり書いてしまいましたが、ここでやっとgitコミットに署名を使うための設定です。

gitconfig

署名付きコミットは git commit -S でできますが、毎回オプションを指定するのは面倒です。だからといって署名せずにコミットを行うのは記事の意図に反しています。そこでgitconfigに設定してしまえば毎回署名付きコミットを行うことができます。

# 毎回署名付きコミットを行う
git config --global commit.gpgsign true
# 署名用GPGキーの長いIDを指定する
git config --global user.signingkey 09990DA502D268F0

GitHubにGPGキーを登録

マスターキーのキーID(今回は C781C1D6CC545538 )かuid(今回は sample@example.com )を指定します。GitHubに登録するGPG鍵は、GitHubに登録されているメールアドレスを含んでいる必要があります。

gpg --armor --export C781C1D6CC545538
# -----BEGIN PGP PUBLIC KEY BLOCK-----
# 
# mDMEYd5tTxYJKwYBBAHaRw8BAQdAcT8KN0xiIxcB4TfktBUTAsFyyl0Rof/yO8II
# Kvan8jC0NHNhbXBsZSBleGFtcGxlIChzYW1wbGUgY29tbWVudCkgPHNhbXBsZUBl
# eGFtcGxlLmNvbT6IlgQTFggAPhYhBO4jJG8kQFQ5m9sY5nUcKMngd3HbBQJh3m1P
# AhsBBQkB4TOABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEHUcKMngd3HbuM0B
# AMvpU6CNmUp7l4+XvjJ1f6v7Reqor41/Kb+YaEVPG0oTAQDFoPcrM1AU4ZxlsmPg
# 2ZNcETnkBO1U2+edS6mummlJBbgzBGHebU8WCSsGAQQB2kcPAQEHQJUno3XqvlcN
# 3AIBVAvO3+X6ORuibpxokHgWlcMl8RX2iPUEGBYIACYWIQTuIyRvJEBUOZvbGOZ1
# HCjJ4Hdx2wUCYd5tTwIbIgUJAeEzgACBCRB1HCjJ4Hdx23YgBBkWCAAdFiEEpQ0R
# s7jUWsRICpKfAnyWbGfGj7EFAmHebU8ACgkQAnyWbGfGj7G3WQEA7dmLc542MmGt
# KtFd+Jk8Gmad8Eyw4U1v4GMYqqXCAKsA/igw84ArmR5o8QylDTzJ8fVpRQpFuwsi
# oXSZBFycXrgGPaoA/j5Ar84i2u0dLHHNCt1Eadlfg8qKGvkrMgtdSYu5zDMEAPsE
# YQVnxvhYWYDP/MB6gIapJACRZJXZEsDWzj79C1C3DA==
# =hp1e
# -----END PGP PUBLIC KEY BLOCK-----

-----BEGIN PGP PUBLIC KEY BLOCK----- から -----END PGP PUBLIC KEY BLOCK----- を含めて、GitHubのGPG keysに登録します。ここで出力された情報はサブキーの情報も含まれています。

add gpg public key to github.com

GitHubに登録したGPG鍵は https://github.com/{username}.gpg または https://api.github.com/users/{username}/gpg_keys で確認することができます。筆者が登録しているGPG鍵は、

で確認できます。

エラー対処

自分が遭遇したエラーについての対処法をメモしておきます。

キー作成/インポートができない

特にインポート時に経験することが多かったのですが、 ${GNUPGHOME}/private-keys-v1.d が存在しないかもしれません。作成すると解決する場合があります。

mkdir -p ${GNUPGHOME}/private-keys-v1.d
chmod 0700 ${GNUPGHOME} && chmod 0700 ${GNUPGHOME}/private-keys-v1.d

sshcontrolに追記できているのに ssh-add -L で表示されない

gpg-agentを再起動すると解決する場合があります。

# 方法1
gpgconf --kill gpg-agent && gpgconf --launch gpg-agent
# 方法2.1 manに記載されている方法
gpgconf --kill gpg-agent && gpg-connect-agent /bye
# 方法2.2
gpg-connect-agent reloadagent /bye
# 方法2.3
echo RELOADAGENT | gpg-connect-agent
# 方法3
ps aux | grep -v grep | grep gpg-agent | awk '{ print $2 }' | xargs kill -9
gpg-connect-agent /bye

または、 SSH_AUTH_SOCK を設定しなおすことで解決する場合があります。

SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
export SSH_AUTH_SOCK

「上記で解決するが同様のエラーが頻発する」場合は、強引な方法ですがssh_configで制御してしまう方法もあります。 ~/.ssh/config の最下部に以下を追記してください。

Match host * exec "[ $'\x22'${gnupg_SSH_AUTH_SOCK_by:-0}$'\x22' = $$ ] && SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) && export SSH_AUTH_SOCK"

ssh -T git@github.comsign_and_send_pubkey: signing failed: agent refused operation が表示される

以下のようなエラーメッセージの場合、パスフレーズ入力がうまく解決できずに止まってしまっている可能性があります。

sign_and_send_pubkey: signing failed: agent refused operation
git@github.com: Permission denied (publickey).

パスフレーズ入力に使用する端末(ターミナル)を指定してやることで解決する場合があります。

GPG_TTY=$(tty)
export GPG_TTY

# 方法1
gpg-connect-agent updatestartuptty /bye
# 方法2
echo UPDATESTARTUPTTY | gpg-connect-agent

または、パスフレーズ入力プログラムを変更することで解決する場合があります。 gpg-agent.conf で明示してください。

yum list installed | grep pinentry
# pinentry.x86_64                             1.1.0-2.el8                              @appstream
find /usr/bin/ -name pinentry*
# /usr/bin/pinentry
# /usr/bin/pinentry-curses

「上記で解決するが同様のエラーが頻発する」場合は、強引な方法ですがssh_configで制御してしまう方法もあります。 ~/.ssh/config の最下部に以下を追記してください。

Match host * exec "GPG_TTY=$(tty) && export GPG_TTY"
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

Appendix A

バッチモードでGPG鍵を作成する

対話モードで入力する値を事前にファイルに記述しておくことで細かい設定を行いながら簡単にGPG鍵の作成を行うことができます。

1点注意として、バッチモードでは1回にマスターキーとサブキーを1つずつしか作れません。マスターキーに2つ以上のサブキーを紐づける場合は --edit-key--quick-add-key で追加する必要があります。

mkdir -p ${GNUPGHOME}/temp && gpg --homedir ${GNUPGHOME}/temp --gen-key --batch <<'EOF'
%echo create master key

Key-Type: EDDSA
Key-Curve: ed25519
Key-Usage: cert

%echo create sub key

Subkey-Type: EDDSA
Subkey-Curve: ed25519
Subkey-Usage: sign,auth

#Subkey-Type: ECDH
#Subkey-Curve: cv25519
#Subkey-Usage: encrypt

#Subkey-Type: EDDSA
#Subkey-Curve: ed25519
#Subkey-Usage: auth

Passphrase: sample.passphrase

Name-Real: sample example
Name-Email: sample@example.com
Name-Comment: sample comment

Expire-Date: 1y

%commit
%echo done.
EOF
gpg --homedir ${GNUPGHOME}/temp --list-secret-keys --keyid-format long --with-fingerprint --with-keygrip
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment