🔑

GPG鍵をSSH鍵として使う

2023/03/19に公開

GPG鍵をSSH鍵として使おうとした際にいつもコケるので備忘録として


  • GnuPG をインストールするときに一緒にインストールされる gpg-agent は ssh-agent として使える
    • なので, GPG鍵をSSH鍵の代わりとして運用できる
  • GPG鍵とかSSH鍵とかもう考えるのが面倒くさい!って人は一つにまとめてしまえば精神衛生がよくなる!

前提条件

  • 私のメインは macOS なので pinentry-mac を使う.
  • SSH鍵として使うのは A (authentication) の副鍵を使う.( A は SSH や TLS における認証に使える)
    • gpg -k または gpg -K したときに usage: A になってる鍵
    /Users/lis2a/.gnupg/pubring.kbx
    -------------------------------
    pub   ed25519 2023-03-13 [C]
      CDD5837D99D6BC1D6F5F5CB2002AEC385BEAEBCF
    sub   ed25519 2023-03-13 [S] [expires: 2024-03-12]
    sub   ed25519 2023-03-13 [A] [expires: 2024-03-12] # ←これ
    
    • もしないなら gpg --edit-key -> addkey で副鍵を追加する
      • 副鍵の追加には秘密鍵が必要です.

gpg-agent の自動起動

GPG関連のコマンドを実行すると基本的 gpg-agent は自動で立ち上がるが, ssh-agent として使用する際は自動起動できない.

シェルの設定ファイルに gpg-agent を起動するよう設定する

.zshrc
gpg-connect-agent --quiet /bye

pinentry-mac のインストール

pinentry-mac は GnuPG に付属してこないので手動でインストールする必要がある

shell
# コマンドからインストール
brew install pinentry-mac

ソケットファイルの場所指定

gpg-agent が参照する SSH用のソケットファイルは ~/.gnupg/S.gpg-agent.ssh にある.

このソケットファイルへのパスは gpgconf --list-dirs で取得できるので SSH_AUTH_SOCK という環境変数として .zprofile に設定する

config.fish
set -x SSH_AUTH_SOCK "$(/opt/homebrew/bin/gpgconf --list-dirs agent-ssh-socket)"

SSH鍵として使う鍵の指定

SSH鍵として使いたい鍵の keygrip を ~/.gnupg/sshcontrol に指定する

keygrip を取得する

shell
gpg -K --with-keygrip

記述する

shell
echo '<KEYGRUP>' >> ${GNUPGHOME:-$HOME/.gnupg}/sshcontrol

SSH鍵を取得する

次のコードで SSH鍵 が吐き出される.

shell
ssh-add -L
GitHubで編集を提案

Discussion