🔐

WSL で 1Password SSH Agent を使うときの注意点 (2025/9版)

に公開
2

はじめに

WSL 環境で GitHub に SSH 接続する際、1Password の SSH Agent を使うと便利ですが、設定を誤ると「エージェントが利用されず、直接鍵ファイルの入力を求められる」「Permission denied」などのトラブルになります。ここでは、迷走しがちなポイントと解決方法をまとめます。筆者があまり仕組みを理解せずにカオスな設定をしてしまった後のトラブルシューティングなので、同じ事象になっている人は少ないかもしれません…

検証環境

Windows ホスト:

  • Microsoft Windows 11 Home (Build 26100)
  • アーキテクチャ: 64 ビット

WSL 環境:

  • Ubuntu 22.04.4 LTS (jammy)
  • 1Password for Windows (SSH Agent 機能有効)

前提条件とセットアップ手順

この記事の解決策は以下の構成を前提としています:

必要な要素

  • Windows 版 1Password: SSH Agent 機能を有効化済み
  • WSL2: Ubuntu 22.04 LTS(他のディストリビューションでも基本的に同じ)
  • ブリッジツール: socatnpiperelay.exe

セットアップ手順

1. Windows 側の設定

1Password for Windows で Integrate with SSH agent を有効にします。これにより Windows 側で \\.\pipe\openssh-ssh-agent パイプが作成されます。

2. ブリッジツールのインストール

WSL 内で以下を実行してブリッジに必要なツールを準備します:

# socat のインストール
sudo apt update
sudo apt install socat

# npiperelay のダウンロードと配置
wget https://github.com/jstarks/npiperelay/releases/latest/download/npiperelay_windows_amd64.zip
mkdir -p ~/tools/npiperelay ~/bin
unzip npiperelay_windows_amd64.zip -d ~/tools/npiperelay/
ln -s ~/tools/npiperelay/npiperelay.exe ~/bin/npiperelay.exe
rm npiperelay_windows_amd64.zip

3. シェル設定の追加

Fish シェルの場合 (~/.config/fish/config.fish):

筆者はfishユーザーなのでこちらを使用

# SSH Agent の設定
set -gx SSH_AUTH_SOCK $HOME/.ssh/agent.sock

# WSL 起動時に SSH Agent へ自動接続
if not ss -a | grep -q $SSH_AUTH_SOCK
    rm -f $SSH_AUTH_SOCK
    nohup socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"$HOME/bin/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent" >/dev/null 2>&1 &
end

Bash シェルの場合 (~/.bashrc):

# SSH Agent の設定
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock

# WSL 起動時に SSH Agent へ自動接続
if ! ss -a | grep -q $SSH_AUTH_SOCK; then
    rm -f $SSH_AUTH_SOCK
    nohup socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"$HOME/bin/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent" >/dev/null 2>&1 &
fi

4. 設定確認

新しいシェルセッションで以下のコマンドが成功することを確認してください:

# SSH_AUTH_SOCK が正しく設定されているか確認
echo $SSH_AUTH_SOCK
# 出力例: /home/username/.ssh/agent.sock

# 1Password の鍵が認識されているか確認
ssh-add -l
# 1Password に登録した SSH 鍵が表示される

# GitHub への接続テスト
ssh -T git@github.com
# Hi username! You've successfully authenticated...

トラブルの原因

筆者は socat + npiperelay を使っているにもかかわらず Windows SSH を使う設定まで重ねていて詰まっていました。

1. SSH コマンドの混同

原因: alias ssh=ssh.exefunction ssh ssh.exe の設定で Windows の SSH を強制使用しているため、WSL 内の SSH_AUTH_SOCK が無視される。

影響: 1Password エージェントに接続できず、鍵ファイルの直接入力が求められる。

2. Git 設定の問題

原因: git config --global core.sshCommand ssh.exe の設定があるため、Git 操作時に Windows SSH が使われる。

影響: WSL の SSH Agent 経由の認証がバイパスされる。


解決のポイント

1. SSH コマンドを WSL 標準に戻す

# エイリアスや関数の削除
# ~/.bashrc または ~/.config/fish/config.fish から以下を削除
# alias ssh="ssh.exe"
# function ssh ssh.exe

# 正しい SSH コマンドが使われているか確認
which ssh
# 期待値: /usr/bin/ssh

2. Git の SSH 設定を解除

# core.sshCommand の解除
git config --global --unset core.sshCommand

# 設定確認で空になっていればOK
git config --global core.sshCommand

3. SSH Agent ブリッジの確認

# SSH_AUTH_SOCK の確認
echo $SSH_AUTH_SOCK
# 期待値: /home/username/.ssh/agent.sock

# 1Password 鍵の確認
ssh-add -l
# 1Password の鍵が表示されることを確認

# 詳細デバッグ
 ssh -vvT git@github.com
# 1Password エージェント経由で認証されることを確認

動作確認

修正後、以下のコマンドで動作確認を行います:

# GitHub SSH 接続テスト
ssh -T git@github.com
# 期待値: Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

# Git 操作テスト
git fetch
# パスフレーズを聞かれず成功する

接続フロー図(推奨方法)

WSL 側の SSH_AUTH_SOCK から socatnpiperelay.exe を経由して Windows の 1Password SSH Agent に接続しています。


まとめ

WSL で 1Password SSH Agent を使う際のポイントを整理します:

重要なポイント

  • アーキテクチャ: socat + npiperelay.exe で Windows の 1Password SSH Agent を WSL にブリッジする
  • SSH コマンド: WSL 標準の /usr/bin/ssh を使用し、Windows の ssh.exe と混同しない
  • Git 設定: core.sshCommand は設定せず、デフォルトの SSH を使用
  • 競合回避: Windows 標準の ssh-agent サービスは無効化

トラブル時のチェック項目

  1. which ssh/usr/bin/ssh が使われているか確認
  2. echo $SSH_AUTH_SOCK でブリッジソケットが設定されているか確認
  3. ssh-add -l で 1Password の鍵が認識されているか確認
  4. git config --global core.sshCommand で余計な設定がないか確認

この構成で WSL から GitHub への SSH 接続が 1Password 経由でスムーズに行えるようになります。


詳細アーキテクチャ図

1) 推奨構成: WSL ssh + socat/npiperelay

ポイント: WSL の /usr/bin/sshSSH_AUTH_SOCK を通じて Windows パイプへ接続し、socat + npiperelay.exe がブリッジ役を担うのが基本構成。


2) 代替: Windows ssh.exe を使う場合の経路と落とし穴

落とし穴:

  • SSH_AUTH_SOCK をWSL側に固定していると ssh.exe は見つけられない。
  • Windows 標準 ssh-agent が動いていると、空のエージェントに接続してしまう。
  • 鍵ファイル直読みになり、パスフレーズで止まりがち。

3) トラブルシュート フロー

チェック順: 1) どの ssh を使っているか → 2) エージェントの見え方 → 3) 競合の排除(標準 ssh-agent / 直読み)。

Windows 側の経路調査は、あくまで ssh.exe を使いたい場合のチェックリストです。WSL だけで運用している場合は、SSH_AUTH_SOCK とブリッジの確認に集中すれば十分です。


参考情報

公式ドキュメント

関連記事・解説

GitHub 関連情報

Microsoft 公式


最終更新: 2025年9月29日
対象: 1Password v8.10.22+ / Windows 11 / WSL2 (Ubuntu 22.04+)

Discussion

Ohkubo KOHEIOhkubo KOHEI

/mnt/c/Users/<username>/.ssh/config に以下を追加すれば十分:

wsl 側の /usr/bin/ssh を使うならこの .ssh/config は参照されないように思うのですが。

実際手元でこの設定を試しましたが、 wsl 側は相変わらず接続できず、 win 側の ssh -T git@github.com は設定を入れる前は正しく動いていたのが設定後は接続できなくなりました。

keisonkeison

ご指摘いただきありがとうございます。
確かに、wslの /usr/bin/ssh は windows 側の .ssh/config は参照していませんでした。(当然ですが該当の記述を削除しても wsl 側の動作に変化はありませんでした。win側に悪影響しかない記述だったかもしれません)

# 不要な記述
Host github.com
  HostName github.com
  User git
  IdentityAgent \\.\pipe\openssh-ssh-agent
  IdentitiesOnly yes

また、記事で「socatnpiperelay は不要」などと書いていましたがこれは誤りで、もともと私の環境で socatnpiperelay を導入しており、そこに重ねて Windows SSH を入れていたため設定が複雑化していました。
私が実際に実行していたコマンドなどの前提条件を追加し、記事を修正いたしました。
この度は誤情報をお伝えしてしまい、大変失礼いたしました。