このWordPressブログはCoreserverでホスティングしている。ブログのアカウントが乗っ取られるとそれなりに困るので、「Two-Factor」というプラグインで2要素認証していた。

ただ、珠にしかログインしないので、毎回ワンタイムパスワードを入力するのがとても手間だった。ほんとに面倒臭い。ワンタイムパスワードは滅びるべきなんじゃないかと思うようになったぐらいだ。

そこで前にWebAuthnを使ってパスワードレスログイン出来ないかと試したことがあった。メジャーなプラグインは「WP-WebAuthn」というやつらしい。ところが、その時はうまく動かなかった。WP-WebAuthnはgmpというPHPのエクステンションを内部で使っているのだが、その時のcoreserverのPHPではgmpがインストールされていなかった。共有レンタルサーバーである以上、諦めるしかなかった。辛い。

ところが、最近メンテナンスが入ってどうやらgmpが使えるようになったようだ。いや、もしかしたら前から使えてたのかもしれないけど。喜び勇んで早速WP-WebAuthnをインストールしたら、今度はブラウザから公開鍵が登録できない。このプラグインはログを保存できるのでログを確認してみるとsodiumというPHPのエクステンションが無いから公開鍵の検証に失敗したみたいなメッセージが書いてあった。いや、またですか・・・。なんかPHP 7.2以上でバンドルされていると書いてあるが、CoreServerのPHP7.2にはなかった。辛い。ちなみにWP-WebAuthnのプラグインページにはsodiumが必要とか一言も書いてなかった。

諦めきれずにphp.iniを見たりして色々試行錯誤していると、コアサーバーのPHP 8.1にはsodiumがインストールされていることがわかった。なぜ7.2にはなくて8.1にはあるのか、さっぱり理由は分からないが、事実としてそうだった。もしかしたら8.0とかにもsodiumがインストールされているかもしれないけど、面倒くさくて調べてない。

結局、CoreServerの管理画面からBlog用ドメインのPHPをPHP81に指定することで無事WP-WebAuthnが使える様になった。こんにちは、パスワードレスな世界。

なお、試行錯誤の過程でWindowsにブログドメイン用の既にゴミとなった秘密鍵がいくつか登録されてしまった。これを削除しなければ、ログイン時アカウントの選択で混乱が生じてしまう。

Windows上のWebAuthnの資格情報(credential)、つまりサイト毎に生成された秘密鍵の削除方法は”How to remove WebAuthN credentials from onboard-TPM on Win10 device?“にあった。今のところWindowsではコマンドラインから操作するしかないらしい。

certutil -csp NGC -key

このコマンドをcmd.exeかpowershellに打ち込むとWindowsに登録されているFIDOの鍵の名前一覧が表示される。鍵の名前は一見すると意味不明な文字列だが、<sid>/<guid>/FIDO_AUTHENTICATOR//<rpIdHash>_<user id>となっているらしい。ここで重要なのはrpIdHashだ。rpとはRelying Partyのことで、公開鍵を登録したサービス、つまり今回だとWP-WebAuthnのことだと思う。rpIdは通常、オリジンのドメインが使われるようだ。そして、このハッシュはSHA256のようだ。ゆえに、「blog.srytk.com」のSHA256ハッシュ「8c9834caf5ae03c6c20afeea4299cbeee6d1cb74859ad72957dad9daa43cdf4d」がこのブログでのrpIdHashになる。なのでこのハッシュがrpIdHashになっている鍵の名前が該当する鍵となる。

該当する鍵の名前が判明したところで、管理者権限で立ち上げたcmd.exeかpowershellに

certutil -csp NGC -delkey ここに判明した鍵の名前

と入力すると無事、秘密鍵が削除された。あとは改めてWebAuthnの鍵を登録し直すだけだ。

はっきり言って煩雑だし、誤って別の鍵を削除する可能性も高い。間違った鍵を削除すると、状況によってはその鍵を使っているアカウントに二度とログインできなくなる場合すらあるので注意が必要だ。少なくともパスワードマネージャーのような管理方法が提供されない限りWebAuthnは普及しにくいのかも…。