> For the complete documentation index, see [llms.txt](https://manual.dxable.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://manual.dxable.com/1password/sign-git-commits-with-ssh.md).

# SSH で Git コミットに署名する

### **SSHでGitコミットに署名する** <a href="#ya7kba3fvwne" id="ya7kba3fvwne"></a>

Gitバージョン 2.34 以降では、SSH鍵を使ったコミットとタグの署名がサポートされており、GPGキーは必要ありません。

つまり、[1Password SSH統合を](https://developer.1password.com/docs/ssh/)使うと、数秒で新しいGit署名鍵をCreateし、秘密鍵を1Passwordから出さずにターミナルアプリやその他の[Gitクライアント](https://developer.1password.com/docs/ssh/agent/compatibility/)で利用できます。1PasswordアプリでSSHを使ってGitコミット署名を自動的に設定することもできます。

コミットに署名すると、[GitHub](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification)または[GitLab](https://docs.gitlab.com/ee/user/project/repository/ssh_signed_commits/#sign-commits-with-your-ssh-key)アカウントに関連付けられた SSH公開鍵を使って暗号的に検証できるため、他の人は変更が実際にあなたによって行われたことを確認できます。リポジトリーへのプッシュ権限を持つ全ユーザーが任意のCreate者として新しいコミットをプッシュできるので、コミットが署名されていない場合は他のユーザーがなりすますことができるため、コミットに署名をすることが重要です。

[1Passwordを使ってGitコミットに署名するのがいかに簡単かを知ってください。](https://blog.1password.com/git-commit-signing/)

### **必要条件** <a href="#r50xpqcjf3dn" id="r50xpqcjf3dn"></a>

始める前に、次のことを行う必要があります。

* [1Passwordデスクトップアプリ](https://1password.com/downloads)をインストールします。
* Git 2.34.0以降にアップデートしてください。
* [1Password SSHエージェントをオン](https://developer.1password.com/docs/ssh/get-started/#step-3-turn-on-the-1password-ssh-agent)にしてください。
* [SSH鍵を生Createまたはインポートし](https://developer.1password.com/docs/ssh/manage-keys/)、Personal、Private、Employee用の保管庫にSaveします。共有保管庫またはカスタム保管庫用に[SSH エージェントを設定している](https://developer.1password.com/docs/ssh/agent#configuration)場合は、代わりにそれらの保管庫のいずれかにSSH鍵をSaveできます。

### **ステップ1：SSHでGitコミットに署名する**![「Git コミット署名の構成」ウィンドウには、構成ファイルを自動的に編集するか、構成スニペットを手動でコピーするかのオプションが表示されます。](/files/U3f7CWAGVbgA7SoMvBew) <a href="#rt37lbd16ee" id="rt37lbd16ee"></a>

SSHを使ってGitコミット署名をグローバルに自動的に設定するには以下のようにします。

1. 1Password デスクトップ アプリで使うSSH鍵を開いてください。
2. ⁝をクリックして\[Configure Commit Signing]を選んでください。
3. 次のウィンドウで、［Edit Automatically］をクリックします。\
   または、［Copy Snippet］をクリックして、スニペットを\~/.gitconfigファイルに手動で貼り付けます。

[単一のリポジトリーでSSH署名を設定する](https://developer.1password.com/docs/ssh/git-commit-signing/#configure-commit-signing-in-a-single-repository)こともできます。

1PasswordはGitの設定ファイルに次の変更を加えます。

* gpg.formatをsshに設定します。
* コミットに署名するためにuser.signingkeyを公開鍵に選択する設定します。
* commit.gpgsignをtrueに設定すると、各コミットにフラグ-Sを含める必要がなくなりま&#x3059;*（オプション）*。
* gpg.ssh.programを1Passwordが提供するSSH署名バイナリーに設定すると、自分でSSH\_AUTH\_SOCKを設定する必要がなくなりま&#x3059;*（オプション）*。

ヒント

WindowsマシンでWSLを使う場合は、[1Password WSL統合](https://developer.1password.com/docs/ssh/integrations/wsl)を設定してSSH および Gitコマンドを認証し、[WSL内でGitコミットに署名する](https://developer.1password.com/docs/ssh/integrations/wsl#sign-git-commits-with-ssh)方法を学んでください。

### **ステップ2：公開鍵を登録する** <a href="#jufg90ebsddb" id="jufg90ebsddb"></a>

SSHコミット署名をローカルで設定したので、他のユーザーがコミットの信頼性を検証できるように公開鍵を登録する必要があります。

GitHubの場合![署名キーが選択された、新しい SSH キーを追加するための GitHub フォーム。](/files/9OwlWtPkJCABtr7WrxfX)

GitHubがコミットを検証できるようにするには、[GitHub SSH鍵設定に](https://github.com/settings/ssh/new)アクセスして、コミット署名用のSSH鍵を登録します。1Passwordブラウザーエクステンションを使うと、公開鍵と鍵のタイトルを自動的に入力できます。

SSH鍵をコミットの署名に使用できるように、［Key type］を必ず［Signing key］に設定してください。

Gitlabの場合

GitLab がコミットを検証できるようにするには、[GitLab SSH鍵設定](https://gitlab.com/-/profile/keys)にアクセスして、コミット署名用のSSH鍵を登録します。1Passwordのブラウザーエクステンションを使うと、公開鍵とキーのタイトルを自動的に入力できます。

SSH鍵をコミットの署名に使用できるようにするには、 ［Usage type］を［Authentication & Signing］または［Signing」に設定してください。

ローカルの場合

[SSH署名をローカルで検証するには、許可された署名者ファイル](https://www.man7.org/linux/man-pages/man1/ssh-keygen.1.html#ALLOWED_SIGNERS)をCreateし、それを使うようにGi を設定する必要があります。

これをグローバルに設定することもできます。\
例:

$ 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にチェックインすることも検討できます。

### **ステップ３：コードをコミット＆プッシュする** <a href="#xh48jiyrikh2" id="xh48jiyrikh2"></a>

これで全ての設定が完了したので、コードをコミットできます。

git commit -m "Signing my first commit with SSH"

1Passwordアプリのロックを解除するのと同じ方法（例えばTouch IDまたは Windows Helloを使う方法）で SSH鍵を認証するように求められます。

![git commit コマンドが表示されている Mac ターミナルに、Touch ID によるコミット署名キーの使用を承認するように求める 1Password プロンプトが重ねて表示されます。](/files/gzsE9y1bpaM2wmrIXaen)

プッシュとプルに使うのと同じキーを使用して署名することを選択した場合は、追加の認証を必要とせずにプッシュすることもできます。

git push

### **ステップ4：コミット署名を検証する** <a href="#vteo7brd4o02" id="vteo7brd4o02"></a>

GitHubの場合![検証済みバッジでマークされ、署名に使用された SSH 公開キーが表示された GitHub コミット。](/files/QjIdY0AmFzhl3Dr85Kz5)

GitHub でコミット履歴を見ると、SSH署名されたコミットにVerifiedバッジが表示されているのが分かります。それをクリックすると、署名に使われたSSH鍵が表示されます。

GitLabの場合![](/files/4mWCIaguzN8TfZSEV8Sa)

GitLabでコミット履歴を見ると、SSH署名されたコミットにVerifiedバッジが表示されているのが分かります。それをクリックすると、署名に使われたSSH鍵が表示されます。

ローカルの場合

コミットをローカルで検証するには、次のコマンドを実行します。

git log --show-signature

### **高度な設定** <a href="#id-7p64p0yp8l3" id="id-7p64p0yp8l3"></a>

#### **単一リポジトリーだけにコミット署名を設定する** <a href="#gtgibu4c0ze7" id="gtgibu4c0ze7"></a>

グローバルではなく、特定のリポジトリーまたはディレクトリーに対してSSHによるGitコミット署名を有効にすることができます。これを行うには、次の手順を実行します。

1. 1Password デスクトップ アプリで使うSSH鍵を開きます。
2. ⁝> Configure Commit Signingと移動します。
3. 次のウィンドウで、［Copy Snippet］をクリックします。
4. グローバルの\~/.gitconfigファイルではなく、リポジトリーの\<git-repo>/.git/configファイルにスニペットを貼り付けます。

#### **複数のコミット署名設定を設定する** <a href="#wve35un1m3bi" id="wve35un1m3bi"></a>

複数のコミット署名設定を設定する場合は\~/.gitconfig内で、includeIfディレクティブを使用できます。

例えばデフォルトとして1PasswordでのSSHコミット署名設定を使用し、/work/acmeサブディレクトリーに1Password以外のGPG設定を使うには、次のようにします。

\~/.gitconfigの例

\[user]\
name = Wendy Appleseed\
email = <wendy@appleseed.com>\
signingkey = ssh-ed25519 AAAAC3NzaC1IZDI1NTE5AAAAIFIUXAdv5sWOrfZFEPAW8liKjBW3sFxuaNITBWwtFKO

\[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の例

\[user]\
email = <wendy.appleseed@acme.com>\
signingkey = 6A40D13BBB936F443084E8C9292E4F983136B860

\[gpg]\
format = openpgp

この例では、\~/work/acme下の全リポジトリーはGPG設定を使用し、その他の全ての場所ではSSH設定が使用されます。

### **ヘルプを受ける** <a href="#k2su3cwp98yh" id="k2su3cwp98yh"></a>

#### **GitがSSHがサポートされていない形式だと言った場合** <a href="#z8tt6vx9sxj4" id="z8tt6vx9sxj4"></a>

次のエラーメッセージが表示される場合は、Gitのバージョンが古くなっている可能性があります。

error: unsupported value for gpg.format: ssh

SSHコミット署名のサポートは、Gitバージョン2.34で追加されました。Gitのバージョンを確認するには、次のコマンドを実行します。

git --version

オペレーティングシステムやGit GUIクライアントには、古いバージョンのGitが同梱されていることがよくあります。より最新バージョンをインストールするには、[Gitのインストール ドキュメント](https://git-scm.com/downloads)を参照してください。

Git GUIクライアントの場合は、アプリの設定をチェックして、Gitバイナリーをより最新バージョンに変更できるかどうかを確認します。

#### **Gitの設定を変更した後にコミットが失敗した場合** <a href="#id-4u158162ob6u" id="id-4u158162ob6u"></a>

次のいずれかのエラーメッセージが表示された場合、それは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

署名鍵が\~/.gitconfigで設定した SSH公開鍵でない場合は、リポジトリーに[ローカルでオーバーライドするものがある可能性があります。](https://developer.1password.com/docs/ssh/git-commit-signing/#local-git-overrides)

#### **許可された署名者ファイルに関連するエラーが表示された場合** <a href="#qqfpsbmr7cpc" id="qqfpsbmr7cpc"></a>

次のエラーメッセージが表示された場合は、[許可された署名者ファイル](https://developer.1password.com/docs/ssh/git-commit-signing/#step-2-register-your-public-key)が正しく設定されていることを確認してください。

error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification

このエラーによってコミットログの参照がブロックされることはありません。コミットの信頼性をローカルで検証できなくなるだけです。

#### **SSH署名されたコミットがGit、GitHub、GitLabによって検証されない場合** <a href="#cggzi7g6jelz" id="cggzi7g6jelz"></a>

SSH経由でコミットに署名したにもかかわらず、検証済みとして表示されない場合は、いくつかの原因が考えられます。

**コミットCreate者のメールが一致しない**

コミット署名は、登録された公開鍵がコミットCreate者のメールと一致する場合にのみ検証済みとして表示されます。GitHubまたは[GitLabに登録したメール](https://github.com/settings/emails)[、](https://gitlab.com/-/profile)または許可された署名者ファイル内のメールと一致していることを確認してください。

\~/.gitconfigに正しいメールアドレスがある場合は、設定がリポジトリーレベルにも正しく反映されているかどうかを確認してください。これを検証するには、リポジトリーのディレクトリーから次のコマンドを実行します。

git config user.email

これが\~/.gitconfigで設定した電子メールでない場合は、リポジトリーに[ローカルにオーバーライドするもの](https://developer.1password.com/docs/ssh/git-commit-signing/#local-git-overrides)がある可能性があります。

**公開鍵の設定が間違っている**

GitHubでは、[SSH鍵設定に](https://github.com/settings/keys)アクセスし、ローカルでuser.signingkeyとして設定した鍵が「Signing keys」の下に表示されることを確認します。

GitLabでは、[SSH鍵設定に](https://gitlab.com/-/profile/keys)アクセスし、ローカルでuser.signingkeyとして設定した鍵が「Your SSH keys」の下に表示されることを確認します。

ローカルで許可された署名者ファイルの場合は、公開鍵が存在し、電子メールと一致していることを確認してください。

**サポートされていないGitクライアントを使用した**

ほとんどのGitクライアントはSSHコミット署名をすぐにサポートしますが、[例外もいくつか](https://developer.1password.com/docs/ssh/agent/compatibility/)あります。Gitを正しく設定したとしても、SSHコミット署名をサポートしていない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
