Zenn
Closed9

既存のGPGキーを利用してGitHubに署名つきコミット・タグを投稿する設定

鷹
gpg --list-keys --keyid-format short

作成済みのGPGキーがあると、以下のように作成したGPGキーの一覧を取得できる。

vscode ➜ /workspaces/any_project (main) $ gpg --list-keys --keyid-format short
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
/home/vscode/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096/AAAAAAAA 2024-12-30 [SC]
      abc4567890123456789012345678901234567890
uid         [ultimate] namename (from MacBook) <mailaddr@gmail.com>
sub   rsa4096/BBBBBBBB 2024-12-30 [E]
sub   rsa4096/CCCCCCCC 2024-12-30 [S]

pub   rsa4096/DDDDDDDD 2024-12-30 [SC]
      def4567890123456789012345678901234567890
uid         [ultimate] namename (use GitHub no-reply email addr) <namename@users.noreply.github.com>
sub   rsa4096/EEEEEEEE 2024-12-30 [E]
sub   rsa4096/FFFFFFFF 2024-12-30 [S]

publicキーの 中身をGitHubに登録する。
noreplyのメールアドレスで作成した方のGPGキーを利用する。
クリップボードにGPGキーをコピーする。

gpg --armor --export DDDDDDDD

https://github.com/settings/gpg/new

↑ここで貼り付ける(リンク先が新規GPGキーの追加画面)

鷹

GnuPGコマンドのオプション

--export
Either export all keys from all keyrings (default keyrings and those registered via option --keyring),
or if at least one name is given, those of the given name.
The exported keys are written to STDOUT or to the file given with option --output.
Use together with --armor to mail those keys.

オプション 意味
-a, --armor 標準はバイナリ形式で出力されるものを、ASCII形式で出力するようにする
--export キーの内容を出力する
鷹

ローカルPC側の設定。

git config --global user.name namename
git config --global user.email namename@users.noreply.github.com
git config --global user.signingkey def4567890123456789012345678901234567890
git config --global gpg.program gpg
git config --global commit.gpgsign true
git config --global tag.gpgsign true
鷹

VSCodeからDevContainer等を利用している場合は Rebuild and Reopen... で設定を反映させる。
(ここちゃんと調べられていないのでまた追記したい)

鷹

Container環境だとまだダメっぽい。

node ➜ /workspaces/any_project (main) $ git commit -m "GPG signing test"
error: gpg failed to sign the data:
[GNUPG:] KEY_CONSIDERED def4567890123456789012345678901234567890 0
[GNUPG:] BEGIN_SIGNING H10
gpg: signing failed: Inappropriate ioctl for device
[GNUPG:] FAILURE sign 12345678
gpg: signing failed: Inappropriate ioctl for device

fatal: failed to write commit object
鷹

macでbashを使っているのでbash_profileに追記する。
ダブルクォーテーションだと $(TTY) が展開されてしまう。(1敗)
リダイレクトの記号(>←これ)を二重にしないと追加じゃなくて上書きになって設定が全部飛ぶ。(1敗)

echo 'export GPG_TTY=$(TTY)' >> ~/.bash_profile
鷹

container環境外であれば、

killall gpg-agent
(何か適当に編集してgit addしてから)
git commit -m "gpg signing test"

で、パスフレーズ認証をしてcommitができるようになる。
(画面が小さいって怒られたらコンソールの画面を大きくしよう)

鷹

docker ps にて稼働中のコンテナの一覧を確認する。

docker ps
CONTAINER ID   IMAGE                                    COMMAND                   CREATED        STATUS        PORTS                                NAMES
aaaaaaaaaaaa   mycontainer                              "/bin/sh -c 'echo Co…"   15 hours ago   Up 15 hours                                        frontend_devcontainer-app-1
bbbbbbbbbbbb   mysql:8                                  "docker-entrypoint.s…"   20 hours ago   Up 20 hours   33060/tcp, 0.0.0.0:53306->3306/tcp   database-app-db-1
cccccccccccc   mcr.microsoft.com/azure-storage/azurite  "docker-entrypoint.s…"   21 hours ago   Up 16 hours   10000-10002/tcp                      frontend_devcontainer-azurite-1

今回Gitの署名設定を反映させたいのは frontend_devcontainer-app-1なので、これに対して設定をコピー。
作成したキーをコンテナ側のホームディレクトリへコピーする。
コンテナがnodeのものなのでこのようになる。

docker cp ~/.gnupg/private-keys-v1.d/ frontend_devcontainer-app-1:/home/node/.gnupg/
Successfully copied 29.2kB to frontend_devcontainer-app-1:/home/node/.gnupg/

すると、署名つきでコミットができた。

node ➜ /workspaces/any_project (main) $ git commit -m "gpg signing test"
[main aaaaaaa] gpg signing test
 1 file changed, 2 insertions(+)
node ➜ /workspaces/any_project (main) $ git push 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 966 bytes | 322.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote: 
remote: GitHub found 8 vulnerabilities on clab-to/any_project's default branch (6 high, 2 moderate). To find out more, visit:
remote:      https://github.com/clab-to/any_project/security/dependabot
remote: 
To https://github.com/clab-to/any_project.git
   zzzzzzz..aaaaaaa  main -> main

実際に署名もできていそう。

このスクラップは3ヶ月前にクローズされました
作成者以外のコメントは許可されていません