SSH で Git コミットに署名する
1Passwordマニュアル|Gitバージョン2.34以降でSSHキーを使ったコミット署名方法を解説。GPGキー不要でセキュアな開発環境を実現します。
1Passwordマニュアル|Gitバージョン2.34以降でSSHキーを使ったコミット署名方法を解説。GPGキー不要でセキュアな開発環境を実現します。
Gitバージョン 2.34 以降では、SSH鍵を使ったコミットとタグの署名がサポートされており、GPGキーは必要ありません。
つまり、使うと、数秒で新しいGit署名鍵をCreateし、秘密鍵を1Passwordから出さずにターミナルアプリやその他ので利用できます。1PasswordアプリでSSHを使ってGitコミット署名を自動的に設定することもできます。
コミットに署名すると、またはアカウントに関連付けられた SSH公開鍵を使って暗号的に検証できるため、他の人は変更が実際にあなたによって行われたことを確認できます。リポジトリーへのプッシュ権限を持つ全ユーザーが任意のCreate者として新しいコミットをプッシュできるので、コミットが署名されていない場合は他のユーザーがなりすますことができるため、コミットに署名をすることが重要です。
始める前に、次のことを行う必要があります。
をインストールします。
Git 2.34.0以降にアップデートしてください。
にしてください。
、Personal、Private、Employee用の保管庫にSaveします。共有保管庫またはカスタム保管庫用に場合は、代わりにそれらの保管庫のいずれかにSSH鍵をSaveできます。
SSHを使ってGitコミット署名をグローバルに自動的に設定するには以下のようにします。
1Password デスクトップ アプリで使うSSH鍵を開いてください。
⁝をクリックして[Configure Commit Signing]を選んでください。
次のウィンドウで、[Edit Automatically]をクリックします。 または、[Copy Snippet]をクリックして、スニペットを~/.gitconfigファイルに手動で貼り付けます。
1PasswordはGitの設定ファイルに次の変更を加えます。
gpg.formatをsshに設定します。
コミットに署名するためにuser.signingkeyを公開鍵に選択する設定します。
commit.gpgsignをtrueに設定すると、各コミットにフラグ-Sを含める必要がなくなります(オプション)。
gpg.ssh.programを1Passwordが提供するSSH署名バイナリーに設定すると、自分でSSH_AUTH_SOCKを設定する必要がなくなります(オプション)。
ヒント
SSHコミット署名をローカルで設定したので、他のユーザーがコミットの信頼性を検証できるように公開鍵を登録する必要があります。
SSH鍵をコミットの署名に使用できるように、[Key type]を必ず[Signing key]に設定してください。
Gitlabの場合
SSH鍵をコミットの署名に使用できるようにするには、 [Usage type]を[Authentication & Signing]または[Signing」に設定してください。
ローカルの場合
これをグローバルに設定することもできます。 例:
$ touch ~/.ssh/allowed_signers $ git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
または、単一のリポジトリーに結び付けるには、次のようにします。
$ touch .git/allowed_signers $ git config --local gpg.ssh.allowedSignersFile .git/allowed_signers
許可された署名者ファイルに、信頼したい電子メールと公開鍵のペアを追加します。
許可された署名者の例: wendy@appleseed.com ssh-ed25519 AAAAC3NzaC1IZDI1NTE5AAAAIFIUXAdv5sWOrfZFEPAW8liKjBW3sFxuaNITBWwtFKO
このファイルを他のユーザーと共有したり、CODEOWNERSファイルと同様にGitにチェックインすることも検討できます。
これで全ての設定が完了したので、コードをコミットできます。
git commit -m "Signing my first commit with SSH"
1Passwordアプリのロックを解除するのと同じ方法(例えばTouch IDまたは Windows Helloを使う方法)で SSH鍵を認証するように求められます。
プッシュとプルに使うのと同じキーを使用して署名することを選択した場合は、追加の認証を必要とせずにプッシュすることもできます。
git push
GitHub でコミット履歴を見ると、SSH署名されたコミットにVerifiedバッジが表示されているのが分かります。それをクリックすると、署名に使われたSSH鍵が表示されます。
GitLabでコミット履歴を見ると、SSH署名されたコミットにVerifiedバッジが表示されているのが分かります。それをクリックすると、署名に使われたSSH鍵が表示されます。
ローカルの場合
コミットをローカルで検証するには、次のコマンドを実行します。
git log --show-signature
グローバルではなく、特定のリポジトリーまたはディレクトリーに対してSSHによるGitコミット署名を有効にすることができます。これを行うには、次の手順を実行します。
1Password デスクトップ アプリで使うSSH鍵を開きます。
⁝> Configure Commit Signingと移動します。
次のウィンドウで、[Copy Snippet]をクリックします。
グローバルの~/.gitconfigファイルではなく、リポジトリーの<git-repo>/.git/configファイルにスニペットを貼り付けます。
複数のコミット署名設定を設定する場合は~/.gitconfig内で、includeIfディレクティブを使用できます。
例えばデフォルトとして1PasswordでのSSHコミット署名設定を使用し、/work/acmeサブディレクトリーに1Password以外のGPG設定を使うには、次のようにします。
~/.gitconfigの例
[commit] gpgsign = true
[gpg] format = ssh
[gpg "ssh"] program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign
[includeIf "gitdir:~/work/acme/"] path = ~/work/acme/.gitconfig
~/work/acme/.gitconfigの例
[gpg] format = openpgp
この例では、~/work/acme下の全リポジトリーはGPG設定を使用し、その他の全ての場所ではSSH設定が使用されます。
次のエラーメッセージが表示される場合は、Gitのバージョンが古くなっている可能性があります。
error: unsupported value for gpg.format: ssh
SSHコミット署名のサポートは、Gitバージョン2.34で追加されました。Gitのバージョンを確認するには、次のコマンドを実行します。
git --version
Git GUIクライアントの場合は、アプリの設定をチェックして、Gitバイナリーをより最新バージョンに変更できるかどうかを確認します。
次のいずれかのエラーメッセージが表示された場合、それはuser.signingkey値に関連している可能性があります。有効なSSH公開鍵に設定されていることを確認してください。
fatal: failed to write commit object could not deserialize public key No such file or directory
user.signingkeyファイル内で~/.gitconfigが正しく設定されている場合は、リポジトリーのディレクトリーから次のコマンドを実行して、リポジトリーレベルで値を確認します。
$ git config user.signingkey
正しい出力の例:
ssh-ed25519 AAAAC3NzaC1IZDI1NTE5AAAAIFIUXAdv5sWOrfZFEPAW8liKjBW3sFxuaNITBWwtFKO
error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification
このエラーによってコミットログの参照がブロックされることはありません。コミットの信頼性をローカルで検証できなくなるだけです。
SSH経由でコミットに署名したにもかかわらず、検証済みとして表示されない場合は、いくつかの原因が考えられます。
コミットCreate者のメールが一致しない
~/.gitconfigに正しいメールアドレスがある場合は、設定がリポジトリーレベルにも正しく反映されているかどうかを確認してください。これを検証するには、リポジトリーのディレクトリーから次のコマンドを実行します。
git config user.email
公開鍵の設定が間違っている
ローカルで許可された署名者ファイルの場合は、公開鍵が存在し、電子メールと一致していることを確認してください。
サポートされていないGitクライアントを使用した
Gitクライアントが最新バージョンであるかどうかも必ず確認してください。
ローカルGitオーバーライド
~/.gitconfigを適切に設定した場合でも、設定がリポジトリーレベルまで正しく伝播されているかどうかも必ず確認してください。
これを検証するには、リポジトリーのディレクトリーから次のコマンドを実行します。
$ cat << EOF $ gpg.format: $(git config gpg.format) $ user.signingkey: $(git config user.signingkey) $ gpg.ssh.program: $(git config gpg.ssh.program) $ commit.gpgsign: $(git config commit.gpgsign) EOF
正しい出力の例:
gpg.format: ssh
user.signingkey: ssh-ed25519 AAAAC3NzaC1IZDI1NTE5AAAAIFIUXAdv5sWOrfZFEPAW8liKjBW3sFxuaNITBWwtFKO gpg.ssh.program: /Applications/1Password.app/Contents/MacOS/op-ssh-sign commit.gpgsign: true
この出力が~/.gitconfigで設定した内容と一致しない場合は、ローカル値を設定解除します。
git config --local --unset gpg.format git config --local --unset user.signingkey git config --local --unset gpg.ssh.program git config --local --unset commit.gpgsign
それでもどこかで間違った値になってしまう場合は、--show-originフラグを使用してその発生元を確認できます。
cat << EOF
gpg.format: $(git config --show-origin gpg.format)
user.signingkey: $(git config --show-origin user.signingkey)
gpg.ssh.program: $(git config --show-origin gpg.ssh.program)
commit.gpgsign: $(git config --show-origin commit.gpgsign)
EOF
こともできます。
WindowsマシンでWSLを使う場合は、を設定してSSH および Gitコマンドを認証し、方法を学んでください。
GitHubの場合
GitHubがコミットを検証できるようにするには、アクセスして、コミット署名用のSSH鍵を登録します。1Passwordブラウザーエクステンションを使うと、公開鍵と鍵のタイトルを自動的に入力できます。
GitLab がコミットを検証できるようにするには、にアクセスして、コミット署名用のSSH鍵を登録します。1Passwordのブラウザーエクステンションを使うと、公開鍵とキーのタイトルを自動的に入力できます。
をCreateし、それを使うようにGi を設定する必要があります。
GitHubの場合
GitLabの場合
[user] name = Wendy Appleseed email = signingkey = ssh-ed25519 AAAAC3NzaC1IZDI1NTE5AAAAIFIUXAdv5sWOrfZFEPAW8liKjBW3sFxuaNITBWwtFKO
[user] email = signingkey = 6A40D13BBB936F443084E8C9292E4F983136B860
オペレーティングシステムやGit GUIクライアントには、古いバージョンのGitが同梱されていることがよくあります。より最新バージョンをインストールするには、を参照してください。
署名鍵が~/.gitconfigで設定した SSH公開鍵でない場合は、リポジトリーに
次のエラーメッセージが表示された場合は、が正しく設定されていることを確認してください。
コミット署名は、登録された公開鍵がコミットCreate者のメールと一致する場合にのみ検証済みとして表示されます。GitHubまたはまたは許可された署名者ファイル内のメールと一致していることを確認してください。
これが~/.gitconfigで設定した電子メールでない場合は、リポジトリーにがある可能性があります。
GitHubでは、アクセスし、ローカルでuser.signingkeyとして設定した鍵が「Signing keys」の下に表示されることを確認します。
GitLabでは、アクセスし、ローカルでuser.signingkeyとして設定した鍵が「Your SSH keys」の下に表示されることを確認します。
ほとんどのGitクライアントはSSHコミット署名をすぐにサポートしますが、あります。Gitを正しく設定したとしても、SSHコミット署名をサポートしていないGitクライアントでは、コミットは署名されないままになります。