ゆるい技術メモ

記事一覧 / Git

Git の SSH 署名を設定する前に確認すること

手順メモ · 一般的な例 · 実行環境依存

通信の認証とコミット署名を分け、公開鍵と検証用の信頼設定を確認する。

SSH 接続と署名は別の役割

SSH で Git サーバーへ接続できることと、コミットに署名が付いていることは別です。署名は特定の鍵でコミット内容に署名したことを確認する仕組みで、その変更が安全であることまで保証しません。

SSH 署名に対応する Git と OpenSSH の環境が前提です。以下は一つのリポジトリだけに設定する一般例です。鍵の作成や認証先への登録を自動で行う手順ではありません。

環境と鍵の所在を確認する

git --version
ssh -V
ssh-add -l

公開鍵ファイルを指定して署名する場合、対応する秘密鍵が ssh-agent から利用できることが必要です。ssh-add -l はエージェントの鍵の指紋を一覧にします。秘密鍵を記事、チャットやリポジトリへ貼り付ける必要はありません。

例の git_signing.pub は既に用意した署名用公開鍵のパスです。手元の鍵を確認して置き換えます。

設定をリポジトリ内に限定する

git config --local gpg.format ssh
git config --local user.signingkey "$HOME/.ssh/git_signing.pub"
git config --local --get gpg.format
git config --local --get user.signingkey

--local は現在のリポジトリの設定を書き換えます。作業場所が正しいリポジトリであることを先に確認します。既存の値がある場合は、変更前に控えておきます。

署名付きコミットと検証

差分とステージ済みファイルを確認してから、署名するコミットを作成します。次のコマンドは実際に新しいコミットを作る操作です。試す場合は練習用リポジトリで行います。

git diff --cached
git commit -S
git log -1 --show-signature

SSH 署名のローカル検証では、信頼する公開鍵を列挙した allowed signers ファイルも必要です。gpg.ssh.allowedSignersFile にそのパスを指定します。ファイルの一行は「principal、鍵の種類、公開鍵本体」という形式です。信頼していない相手の鍵を、検証を通すためだけに追加しません。

git config --local gpg.ssh.allowedSignersFile "$HOME/.config/git/allowed_signers"
git verify-commit HEAD

上のパスには、事前に内容を確認して作成したファイルが必要です。署名が存在しても信頼する鍵の登録がなければ検証に失敗し得ます。ホスティングサービスの認証表示も、そのサービス側の鍵登録や判定条件によります。

参考にした公式資料