1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSLからWindows Helloを使い倒す

1
Last updated at Posted at 2025-08-23

目的

Windows Helloを利用すると、Windowsへのログインを指紋認証などで行うことができます。

これに慣れてくると、CUIを使っている時でも、パスワードを打つ代わりに指紋で何とかならないか、という気分になってきます。

現在、私にとってWindows のCUIの最優先はWSL(+Windows Terminal)となっていますので、この環境でどこまで指紋認証で行えるかをまとめました。

結構前に記述して下書きのままでしたが、設定内容は現在もそのままなので公開します。

前提

1password

勤務先から1Passwordのアカウントを提供されており、これを使うものが多くなります。
LastPassなど他のパスワード管理製品でも同じことができる部分はあると思いますが、すみませんがそれらには触れていません。
こうすれば対応できるよ、というコメントをいただければ追記したいと思います。

Windows Hello

また、1PasswordのWindows版はWindows Helloと組み合わせることで本領を発揮します。
起動後の初回のみ1Passwordのパスフレーズ入力が必要ですが、それ以降は指紋や顔認証で利用できるようになります。デスクトップなどで指紋認証が付いていない場合、Windows Hello に対応した指紋認証やカメラを導入することをお勧めします。

私はUSB接続のWindows Hello対応の指紋認証デバイス(Amazonで3000円未満)とクランプ付きのUSBハブを買って近くの本棚に固定して使っていました。その後、同じくWindows Hello対応のカメラをつけることで顔認証を利用し、すぐ横にある指紋リーダーへ手を動かすことすらしない、ぐうたらな環境を構築しています。

SSH Agent

1Passwordは最新のVersion 8からSSH Agentとしての機能を提供しています。
登録されている秘密鍵の復号にWindows Helloを利用することができます。

手順としては

  • SSHの秘密鍵を1Passwordに登録
  • 1Passwordの開発者向け機能にあるSSH Agentを有効化
  • npiperelayとsocat(sudo apt install socatで導入)を利用し、WSLから1PasswordにSSH Agent要求を転送する

だけです。

.bash_profileでこんな風にしてます。

# ssh-agent	
if [ -z $SSH_AUTH_SOCK ]; then
# forwardingされえなければAgentを設定
    if [ -d /mnt/c/oss/wsl-gpg-agent ]; then
        # on wsl2
        export SSH_AUTH_SOCK=~/.ssh/agent.sock
	
        ALREADY_RUNNING=$(ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent")
        if [ $? -ne 0 ]; then
            rm -f $SSH_AUTH_SOCK
            (setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"/mnt/c/oss/wsl-gpg-agent/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork & ) #> /dev/null 2>&1
        fi
    else

        # other
        SSH_KEY_LIFE_TIME_SEC=3600
        SSH_AGENT_FILE=$HOME/.ssh-agent
        test -f $SSH_AGENT_FILE && source $SSH_AGENT_FILE > /dev/null 2>&1
        if [ $( ps -ef | grep ssh-agent | grep -v grep | wc -l ) -eq 0 ]; then
            ssh-agent -t $SSH_KEY_LIFE_TIME_SEC > $SSH_AGENT_FILE
	    source $SSH_AGENT_FILE > /dev/null 2>&1
        fi
    fi

fi

通常のSSH Agentと同じプロトコルなので、クライアントのsshなどはWSLに含まれる通常のLinuxのものが利用できます

1passwordの公式のガイドではsshをWindows側のssh.exeを使うようにするということになっていましたが、~/.ssh/configの扱いがWindows側になってしまうのが気持ち悪い&chezmoiとの相性が悪いのでwsl側のsshをそのまま使いたいのでこうしています。

SSH Agentなので、Agent Forwardを利用し、SSHで接続したその先のサーバー内からも1Password内の秘密鍵を利用することができます。
この秘密鍵の提供は1Password GUIが行うので、Windows Helloで認証できます。

sudo

通常、sudo ではパスワードを入力しますが、これもWindows Helloで代替させることができます。
これは1Passwordではなく、nullpo head(Takaya Saekiさん)の作成されたWindows Hello Sudoだけで実現することができます。

詳しくはpapemk2さんの記事を参照ください。

1Passwordからの文書の取り出し(Chezmoiなど)

[2025/10/15]確認したところ、うまく動いていないようです。
Windows側のnamed pipeの接続ができていないようです。
cmd.exeを経由したop.exeを呼んだ場合、GUIと連携できているので対応方針を検討しており、別途更新します。
それまではLinux用の1password clientを利用してください。

chezmoiを使いdotファイルを管理する際に、.sshやAPIキーを含むファイルなどは1Passwordにしまっておくことで安全に管理できます。格納や取り出しの際には1Passwordの認証が必要ですが、これも指紋認証で対応できます。

指紋認証を利用するにはLinux版の1Password CUIではなく、Windows版のCUIクライアントを利用します(もとは、Goから外部コマンドの呼び出しではPATHの「~」が展開されないに設定方法を記述していたのをこちらにまとめました)。

WSL2の環境で、chezmoiから1Password CLIを利用しているのですが、Linux版のCLIはWSL2のホストで動いている1Password GUIと通信してくれません。そのため、1Passwordの長いマスターパスワードを打ち込む必要があります(ひょっとするとGnomeなどのクライアントとは通信できるのかもしれませんが未確認です)。
一方、Windows版の1Password CLIでは、1Password GUIでWindows Helloを設定していると、Hello経由で指紋などで認証を行えます。

Windows Helloでの認証をWSL環境からも使いたいと思い、WSL側からWindows版の1Passwordを利用を試みていたのですが、chezmoiからの利用のみ上記の理由でうまく呼び出せずはまっていました(1Password CLIの利用がほぼchezmoiのみなので、とん挫するところでした)。

WSLのフォルダにWindows版1Password CLIへのシンボリックリンクをopという名前で置き、そのフォルダをフルパスでPATHに追加すればchezmoi(go)からWindows版1Password CLIが呼び出され、Windows Helloでの認証で動作しました。

Windows版1Password CLIのフォルダを直接PATHに指定しても動くかもしれませんが、なんとなく気持ち悪いので未検証です。

問題

上記の対応で一応は動いているのですが、たまにエラーが発生するようです(chezmoi applyでエラー)。1Passwordに大量の文書を登録している私のようなひとはほぼ確実にエラーで止まってしまいます。
同じ文書(op document get)でこけているわけでもないので、単純に呼び出せない、というわけではなさそうです。実行のタイミングか確率的に発生する問題のようです。

証明書を1Passwordに移しているが、.sshにも置いているのでこの辺を減らせば対処自体が不要かもしれません。とはいえ発生確率と全体数量(文書数)の問題でしかないので、対処はしたほうがよさそうです。

対処

エラーの発生状況などから、op document get の実行間隔の制約らしいことがわかりました。

1Password CLIのLinux版やMac版では、op signinでTOKENが発行されるのに対し、Windows版ではTOKENの発行などがないため、リクエストの都度1Passwordのサーバー側かGUIクライアントとの通信を行っているようです。
その関係?でchezmoi applyの実行中に~/.sshフォルダの取得などで1passwordからのファイル取得が繰り返され高頻度での実行となったときにエラーとなるようです。

op.exeの呼び出しをシンボリックリンク経由ではなく、以下のようなシェルスクリプトを挟みリトライとウェイトを入れることで、エラーの発生頻度がなくなりました(というか、想定しているretryも発生しないように見える)。
スクリプトではop.exec:\oss\1password\op.exeに置く想定としています(変数化すべきかもしれません)。

#! /bin/bash
#echo $* 1>&2
if [ "$1" != "document" ] && [ "$1" != "read" ]; then
    /mnt/c/oss/1password/op.exe $*
elif ! (ps | grep ' chezmoi$' > /dev/null 2>&1) ; then
    /mnt/c/oss/1password/op.exe $*
else
    RESULT=
    for i in {1..10}; do
        stdout=
        stderr=

        # 標準出力・エラー出力・戻り値をすべて変数に入れる
        # https://takamaruo.hatenablog.com/entry/2018/10/19/235900
        eval "$((/mnt/c/oss/1password/op.exe $*) 2> >(stderr=$(cat);typeset -p stderr) > >(stdout=$(cat);typeset -p stdout);RESULT=$?;typeset -p RESULT)"
        if [ $RESULT ] ; then
            echo "${stdout}"
            echo -n o 1>&2  # 状況表示用。chezmoiなどの表示が乱れるので不要な方はコメントアウト
            exit 0
        fi
        echo 1>&2
        echo retry $i : op $*  1>&2 # 状況表示用。chezmoiなどの表示が乱れるので不要な方はコメントアウト
        sleep 1
    done
    echo "${stdout}"
    echo "${stderr}" 1>&2
    exit $RESULT
fi

もとは、もっと単純にエラーコードをチェックし、retryしていたのですが、chezmoi documentのみに対象を絞り、リトライを入れることでうまく動いているようです。しかし、うまくいく原因は不明で、これ以上はchezmoiのソースとかを見ないとわからなさそうです。

私の環境では1Passwordに登録した秘密鍵も.sshにも置いているので、これを無くすと1Passwordからgetするdocumentが減るため、問題自体が発生しにくくなり、単純なシンボリックリンクでも問題が発生しにくくなるかもしれません。

Macと比べて

macでもほぼ同様のことを行うことができます。

Macのほうが良い点

Macの場合、指紋認証で登録しておくと、Apple Watchへの通知に応答することでも認証に応答することができます。これはMacBookの蓋を閉じて使うクラムシェル運用や、本体をすこし離れた場所に置いてある場合などに本体へアクセスせずに認証を行うことができ、大変便利です。

Windows Helloではこのようなことができず、指紋認証を手元のキーボードのそばにおく、などの対応が必要となってしまいます。

ただ、Macをクラムシェルで利用していると、1Passwordは指紋認証を要求する代わりにマスターパスワードの入力を要求してくるので、せっかくのApple Watchでの認証が使えません(クラムシェルでは指紋が使えないとして、マスターパスワードを要求してきてしまう。Apple Watchもあるのに!)。1Passwordの作りの問題なので、将来的に何とかなると嬉しいです。

最近はmac本体のモニタをサブスクリーンにしているので、最新の状況とはずれているかもしれません。とりあえず、1PasswordではApple Watchで認証を通過させるには1Password側での設定も必要になったので注意してください。

現状でもクラムシェルさえあきらめればいろいろとはかどります。

Windowsのほうが良い点

Macの1Passwordクライアントの実装はLinux版と同じつくりのようで、Mac版GUIの1Passwordとは直接連携はしていないようです。WSLとWindowsのような特殊な関係が存在しないので、Windows版CUIを使う、という技も使えず、document取得(chezmoi)では指紋認証が使えません(ただ、Windows Helloが使える状態にしてあれば、PINの入力で代替できるので少し手間は増えますが致命的ではないです)。

外部プログラムを開発すれば似たようなことは実現できそうな気はしますが、

  • Windows側が快適になってしまったのでこちらがメインになりつつある
  • Chezmoiを使う場面はそんなに多くない

ので個人的に対応する予定はないです。

ただ、マスターパスワードは長いので何とかなるものなら何とかしたいところですね。`

まとめ

Windowsのユーザーパスワードやsshのパスフレーズを入力する場面などはほぼすべてWindows Helloの指紋や顔認証へ任せられるようになりました。新しく何かができるようになるわけではないのですが、日々の操作が省力化されるのは作業が快適になるのでおすすめしておきます。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?