Windows版1Password入れたアンタ、それ"認証が死ぬ罠"よ💋 WSL2でSSOを通す唯一の正解
🍸 今夜のお持ち帰り(先出し)
- SSO強制の1Passwordは、CLI単体(
op account add)ではログインできない。デスクトップアプリ連携が必須 - WSL2では Windows版じゃなくて、WSLの中にLinux版アプリ を入れるのが正解
- SSOサインインは WSL内のLinuxブラウザ で完結させること(Windowsブラウザに飛ばすと鍵が戻らない)
- ゴールは
op run --env-file=.env.op -- <cmd>がネイティブに動く状態。マルチライン PEM もそのまま注入できる
詳しくは最後の「お持ち帰り(本編)」でまとめるわね💋
🍑 オープニング:アタシ、認証が一生通らないんですぅ
👩🎤ちぃママ: ママぁ〜‼️ アタシね、WSL2で開発してるんですけど、.env に APIキーをベタ書きするのやめたくて、1Passwordから流し込もうとしたんですぅ💦
👩ママ: あら、いい心がけじゃないの💋 平文の .env なんて、財布を開けっぱなしでカウンターに置いとくようなものよ。それで、何をやらかしたの?
👩🎤ちぃママ: とりあえずWindowsに1Passwordのアプリ入れて、op.exe も入れて、サインインしようとしたんですけどぉ… SSOの画面のあと、認証が 一生戻ってこない んですよぉ‼️ アタシのアカウント、永久迷子なのッ⁉️
👩ママ: ちょっとアンタァァァ‼️ そこが 一番ハマるとこ じゃないのよッ💢 順番に解いてあげるから、グラス置いて聞きなさいな💋
🔍 なぜこんなに難しいの?──「二重の壁」があるのよ
👩🎤ちぃママ: だってぇ、いつもの1Passwordなら、シークレットキーとマスターパスワードでログインできるじゃないですかぁ。
👩ママ: そこなのよ、ちぃママ。アンタの会社、Okta だか Google Workspace だかの SSO強制 でしょ? あれはね、シークレットキーもマスターパスワードも持ってない のよ。認証ぜんぶIdP(会社の認証基盤)に丸投げしてるの。
👩🎤ちぃママ: えぇぇ⁉️ じゃあ op account add で手でサインインってのが…
👩ママ: 使えないの💋 SSOアカウントは、デスクトップアプリ経由でしかセッションを取れない。これが 一つ目の壁 ね。
👩🎤ちぃママ: ぎゃー‼️ じゃあアタシ、Windowsにアプリ入れたの正解だったんじゃ…
👩ママ: それが 二つ目の壁 なのよ、おバカちゃん💋 Windows版アプリ+op.exe で繋ぐと、op.exe run -- <cmd> が子プロセスを Windowsプロセスとして 起動するの。アンタがWSLの中で動かしたい uv も uvicorn も docker も、ぜんぶLinux育ちでしょ? Windowsのお父さんからは生まれてこないのよ。
👩🎤ちぃママ: な… ななななななな。壁が二枚⁉️
ここで起きていることを整理しておきます。
二重の壁
-
SSOの壁:SSOアカウントは Secret Key / マスターパスワードを持たず、認証をIdPに委譲する。そのため手動サインイン(
op account add)が使えず、opはデスクトップアプリ経由でしかセッションを取得できない。 -
WSLの壁:Windows版デスクトップアプリ+Windows版
op.exeで繋ぐと、op.exe runが子プロセスをWindowsプロセスとして起動するため、WSL内のLinux native なuv/uvicorn/dockerを起動できない。
👩ママ: この2枚を 同時に ぶち抜く方法はね──「WSLの中にLinux版デスクトップアプリを置く」。これ一択よ💋
🪩 正解の全体構成
👩🎤ちぃママ: 全体像が見たいですぅ〜!アタシ、絵がないと迷子になるタチなんですよぉ💦
👩ママ: はいはい、まとめてあげるわね💋
👩ママ: ポイントはね、サインインも、CLI連携も、コマンド実行も、ぜ〜んぶWSLの中で閉じてる ってこと。Windows側に鍵を渡さないの。これが鉄則よ💋
🛠️ 前提条件チェック
👩🎤ちぃママ: いきなりインストールしていいですかぁ⁉️
👩ママ: お待ちなさいな💋 Linux版デスクトップアプリを動かすには、WSLg(GUI) と systemd が要るのよ。まずは身体検査からね。
ps -p 1 -o comm= # systemd であること
ls -d /mnt/wslg # WSLg が存在すること
echo "$DISPLAY $WAYLAND_DISPLAY" # :0 wayland-0 など
cat /etc/wsl.conf # [boot] systemd=true
👩ママ: もし systemd が無効だったら、/etc/wsl.conf にこう書いて、PowerShellから wsl --shutdown で一回寝かせて起こしなさいな。
[boot]
systemd=true
💄 手順:壁を抜けるための7ステップ
Step 1. WSLに Linux版 op CLI を入れる
👩ママ: まずは正規の鍵とリポジトリを登録してから、CLIを入れるのよ💋
curl -sS https://downloads.1password.com/linux/keys/1password.asc | \
sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] https://downloads.1password.com/linux/debian/$(dpkg --print-architecture) stable main" | \
sudo tee /etc/apt/sources.list.d/1password.list
sudo mkdir -p /etc/debsig/policies/AC2D62742012EA22/
curl -sS https://downloads.1password.com/linux/debian/debsig/1password.pol | \
sudo tee /etc/debsig/policies/AC2D62742012EA22/1password.pol
sudo mkdir -p /usr/share/debsig/keyrings/AC2D62742012EA22
curl -sS https://downloads.1password.com/linux/keys/1password.asc | \
sudo gpg --dearmor --output /usr/share/debsig/keyrings/AC2D62742012EA22/debsig.gpg
sudo apt update && sudo apt install -y 1password-cli
op --version
Step 2. Linux版デスクトップアプリ+依存を入れる
sudo apt install -y 1password polkitd gnome-keyring
👩ママ: それぞれ役割があるのよ💋
-
1password… GUIデスクトップアプリ本体(リポジトリは Step 1 で追加済み) -
polkitd… 「Unlock using system authentication」に必須 -
gnome-keyring… 認証情報の保管庫
Step 3.(最重要)SSO用に WSL内 Linuxブラウザ を用意する
👩🎤ちぃママ: あっ、ここですよねッ‼️ アタシが認証迷子になったの‼️
👩ママ: そうよ、ここが 一番ハマる とこ💋 Windowsブラウザ(wslview)を既定にすると、SSO後の onepassword:// コールバックを Windows版アプリが横取り して、WSLのLinuxアプリに鍵が渡らないの。だから SSOフロー全体をWSL内ブラウザで完結 させるのよ。
Linux版の Google Chrome(公式 .deb)を入れる例です。
wget -O /tmp/chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install -y /tmp/chrome.deb
既定ブラウザをLinux Chromeにします。
xdg-settings set default-web-browser google-chrome.desktop
# 確認:onepassword スキームが Linux アプリに向いていること
xdg-mime query default x-scheme-handler/onepassword # -> 1password.desktop
x-scheme-handler/onepassword は1Passwordの .deb が自動で 1password.desktop に登録してくれます。あとは http / https ハンドラをLinuxブラウザに向ければ、認証もコールバックもWSL内で閉じます。
Step 4. WSLgで Chromeのカーソルが消える問題に対処
👩🎤ちぃママ: ママぁ〜、Chrome開いたらマウスカーソルが透明人間になったんですけどぉ⁉️ 心霊現象ですかぁ⁉️
👩ママ: 幽霊じゃないわよ💋 WSLg+Chromeで、XWayland経由だと XCURSOR_THEME が未設定でカーソルのビットマップを読めないの。.desktop に環境変数とフラグを仕込めば成仏するわ。
mkdir -p ~/.local/share/applications
sed 's#^Exec=/usr/bin/google-chrome-stable#Exec=env XCURSOR_THEME=Adwaita XCURSOR_SIZE=24 /usr/bin/google-chrome-stable --ozone-platform=x11#' \
/usr/share/applications/google-chrome.desktop > ~/.local/share/applications/google-chrome.desktop
update-desktop-database ~/.local/share/applications
-
XCURSOR_THEME=Adwaita… カーソルテーマを明示(/usr/share/icons/Adwaita/cursorsが必要。無ければsudo apt install adwaita-icon-theme) -
--ozone-platform=x11… XWayland強制(カーソル描画が安定する) - それでもダメなら wsl を再起動
wsl.exe --shutdown
既存のChromeが起動中だと、xdg-open は既存インスタンスに新タブを開くだけでフラグが効きません。必ず pkill -f google-chrome してから再起動してください。
Step 5. SSOサインイン+新デバイス鍵転送
👩ママ: ここまで来たらアプリを起こすのよ💋
1password &
- SSO(IdP / Google)でサインイン → WSL内のChrome が開いて認証
- 「Transfer your encryption key(暗号鍵の転送)」モーダルが出る場合がある
- これはSSO特有の 新デバイス認証。すでに認証済みの別の1Password(他デバイスやブラウザ拡張)に確認コードを出させて入力する必要がある
- 目的のVaultが見えたらサインイン成功💋
👩🎤ちぃママ: 暗号鍵の転送…⁉️ なんだか壮大ですぅ🌠
👩ママ: 大げさに聞こえるけど、要は「この新顔(WSLのアプリ)、信用していい子?」って既存の自分に確認してるだけよ💋 スマホの1Passwordか、別PCの1Passwordを認証元に使いなさいな。
Step 6. CLI連携を有効化
👩ママ: Linuxデスクトップアプリの設定で、2つのトグルをONにするのよ💋
- Settings → Security →「Unlock using system authentication」を ON(polkitを使う)
- Settings → Developer →「Integrate with 1Password CLI」を ON
確認はこうね。
op account list # アカウントが表示される
op vault list # Vault 一覧が出る
Step 7. 動作検証(op run の注入確認)
👩🎤ちぃママ: ちゃんと注入できてるか、不安なんですけどぉ💦 値を画面に出して確認しちゃダメなんですよねぇ?
👩ママ: えらいじゃないの💋 そう、値は漏らさず に確認するのよ。こうやるの。
# .env.op の全参照が解決できるか(値は出力せず破棄)
op inject -i .env.op > /dev/null && echo OK
# op run が実際に env へ注入できるか(値を漏らさず確認)
op run --env-file=.env.op -- bash -c '
[ -n "$OPENAI_API_KEY" ] && echo "OPENAI_API_KEY injected"
lines=$(printf "%s" "$ANYFLOW_JWT_PRIVATE_KEY" | wc -l)
[ "$lines" -gt 1 ] && echo "multiline PEM injected ($lines lines)"
'
op run は exec で直接プロセスの env に値をセットするため、マルチライン PEM もそのまま渡せる のがポイントです。
🚨 ハマりどころ early-warning 集
👩ママ: よく踏む地雷をまとめておくわね💋 ヒヤッとしたら、まずここを見なさいな。
| 症状 | 原因 | 対処 |
|---|---|---|
op account list が空 / "No accounts configured" |
CLI連携トグルが未ON | Step 6 |
| SSOコールバックがWindows版アプリに吸われる | 既定ブラウザが wslview(Windows) |
Step 3:Linuxブラウザを既定に |
| Chromeのカーソルが消える | XWaylandのカーソルテーマ未設定 | Step 4 |
| 「Unlock using system authentication」が押せない | polkit未導入 | sudo apt install polkitd |
| 「暗号鍵の転送」でCancelしかない | 新デバイス認証の確認コード元が無い | 既存認証済み1Passwordから発行 |
WSL再起動後に op が動かない |
Linuxアプリ未起動 / 未アンロック | アプリを起動・アンロック |
💋 なぜ「op.exe + inject」方式を採らないの?
👩🎤ちぃママ: ママぁ、ネットだとぉ、Windows版アプリと op.exe を使って eval $(op.exe inject -i .env.op) で流し込む記事も見るんですけどぉ。あれじゃダメなんですかぁ?
👩ママ: Windows Helloが使える利点はあるのよ。あるんだけどね、ちぃママ💋 致命傷が二つあるの。
👩ママ: 一つ目──マルチライン PEM(KEY=op://.../pem)だと、eval や source が 壊れる の。2行目以降をシェルコマンドだと勘違いして実行しちゃうのよ。秘密鍵がコマンドとして暴走するなんて、悪夢でしょ?
👩🎤ちぃママ: ぎゃー‼️ 鍵が勝手に踊り出すんですねぇ‼️
👩ママ: 二つ目──チーム標準の op run --env-file=.env.op -- <cmd> を そのまま使えない。全コマンドにWSL専用の書き方が必要になるの。チームのみんなと違う呪文を唱える羽目になるのよ💋
op run 互換と、マルチライン PEM 対応を 両立 できるのはLinux版アプリ方式だけ。だからこっちを推奨するわ💋
🌹 お持ち帰り(本編)
👩ママ: さ、今夜のまとめよ💋 これだけ覚えて帰りなさいな。
🍸 WSL2 × SSO 1Password 完全攻略
- SSO強制アカウントは デスクトップアプリ連携が必須(
op account addは使えない) - WSL2では WSLの中にLinux版デスクトップアプリ を置く(Windows版は子プロセスをWindows化してLinuxツールを殺す)
- SSOサインインは WSL内のLinuxブラウザ で完結させる(
onepassword://コールバックをWindowsに横取りさせない) - CLI連携の2トグル(system authentication / Integrate with CLI)をONにする
- ゴールは
op run --env-file=.env.op -- <cmd>がネイティブに動く状態。マルチライン PEM もそのまま注入 でき、.env平文を卒業できる
👩🎤ちぃママ: ママぁ〜‼️ アタシ、Windows版を入れた瞬間に詰んでたんですねぇ… 遠回りしちゃったぁ💦
👩ママ: いいのよ、ちぃママ💋 遠回りした人ほど、どこで道が折れるか を身体で覚えるの。秘密ってのはね、財布の中身じゃなくて、渡し方 に品が出るものよ。アンタの .env、今夜やっと淑女になったわね✨
👩🎤ちぃママ: 淑女ぉ〜🎵 アタシの環境変数、デビューですぅ‼️
👩ママ: はいはい、デビューはいいから今日はもう閉店💄 また迷子になったら、いつでもいらっしゃい💋