LINE FIDO2 ServerをWindows11(Windows 10も同じ)で動作させる方法です。
WebAuthn(FIDO2)のサイト・アプリ開発時にOSSのLINE FIDO2 Serverが便利です。
ただ、Windows開発PCでFIDO2サーバーが動作しませんでした。
プラットフォーム固有の処理を分岐して、Windows11のローカルPCでも動作させる手順を記載します。
また、実際の運用ではDBを永続化する必要があります。
H2のインメモリからファイル永続化に切り替える設定と注意点も記載します。
流れ:
1. serverのエラー対応
ソースコードダウンロード・ビルド
エラー確認
EmbeddedRedisServerConfigクラス修正
エラー確認
EmbeddedRedisServerConfigクラス修正
2. H2ファイル永続化設定
application-local.yml修正
ddl-auto設定
H2 ConsoleにアクセスしてRP登録
application-local.yml修正
ddl-auto設定
H2 ConsoleにアクセスしてRP登録
1. serverのエラー対応
まずはGitHubからソースコードをダウンロードします。
ダウンロードしたらビルドします。
まずはGitHubのREADME - How to run - Manualに書かれているとおり実行してみます。
rpserver はRP(FIDO2を利用するアプリケーション)のサンプルです。こちらはそのままでも正常起動します。
serverのほうが、Windows11(10も同じ)で起動しません。
cd server
gradlew bootRun
以下のエラーが発生します。
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'embeddedRedisServerConfig':
Invocation of init method failed;
nested exception is java.io.IOException:
Cannot run program "/bin/sh":
CreateProcess error=2, 指定されたファイルが見つかりません。
Error creating bean with name 'embeddedRedisServerConfig':
Invocation of init method failed;
nested exception is java.io.IOException:
Cannot run program "/bin/sh":
CreateProcess error=2, 指定されたファイルが見つかりません。
組み込みのRedisを起動するときに未使用ポートを探すコマンドがLinuxプラットフォームの想定となっています。
問題のEmbeddedRedisServerConfigクラスをWindowsでも動作するように修正します。
修正箇所はexecuteGrepProcessCommandメソッドです。Fileクラスを使うのでimport追加も必要です。
修正後のexecuteGrepProcessCommandメソッドは以下のようになります。
private Process executeGrepProcessCommand(int port) throws IOException {
String command = String.format("netstat -nat | grep LISTEN|grep %d", port);
String sh = "/bin/sh";
String option = "-c";
if (File.separatorChar == '\\') {
// If windows
command = command.replace("grep", "findstr");
sh = "cmd";
option = "/c";
}
String[] shell = {sh, option, command};
//System.out.println(sh + " " + option + " " + command);
return Runtime.getRuntime().exec(shell);
}
String command = String.format("netstat -nat | grep LISTEN|grep %d", port);
String sh = "/bin/sh";
String option = "-c";
if (File.separatorChar == '\\') {
// If windows
command = command.replace("grep", "findstr");
sh = "cmd";
option = "/c";
}
String[] shell = {sh, option, command};
//System.out.println(sh + " " + option + " " + command);
return Runtime.getRuntime().exec(shell);
}
"/bin/sh"コマンドを、Windowsの場合は"cmd"に、grepコマンドをWindowsの場合は"findstr"コマンドに置き換えます。
以上でserver(FIDO2 Server)が正常に起動します。
rpserver、server両方起動したあと、http://localhost:8080 にアクセスするとサンプル画面が表示されます。
登録:
User nameとDisplay nameを入力して"Register"ボタンを押すと登録できます。
※ドメイン参加のPC等でWindowsHelloを使えない場合、かつハードウェアキーも無い状態だと、デフォルト設定のままでは登録できません。
その場合は、"Authenticator selection"のチェックを外すことでChromeだとパスキーが使用できるようです。
認証:
"Authenticate"ボタンを押すと認証を確認できます。
ここまででWebAuthnの動作は確認できますが、server(FIDO2 Server)を再起動すると認証情報が消えています。
デフォルトではh2 databaseのインメモリモードで認証情報を保持しているためです。
2. H2ファイル永続化設定
h2 databaseのモードをファイル永続化に変更して、認証情報が保持されるようにします。
server\src\main\resources\application-local.yml を編集します。
spring:
profiles:
active: local
h2:
console:
enabled: true
settings:
web-allow-others: true
datasource:
driver-class-name: org.h2.Driver
#url: jdbc:h2:mem:userdb;
url: jdbc:h2:.\line-fido2-db
username: sa
password:
jpa:
hibernate:
ddl-auto: update
~
profiles:
active: local
h2:
console:
enabled: true
settings:
web-allow-others: true
datasource:
driver-class-name: org.h2.Driver
#url: jdbc:h2:mem:userdb;
url: jdbc:h2:.\line-fido2-db
username: sa
password:
jpa:
hibernate:
ddl-auto: update
~
spring.datasource.urlの変更と、spring.jpa.hibernate.ddl-autoを追加しています。
spring.datasource.urlは、インメモリからファイル永続化への変更です。
".\line-fido2-db" と指定すると、serverフォルダ直下に"line-fido2-db.mv.db"ファイルが作成されます。
spring.jpa.hibernate.ddl-autoには"update"を追加しています。
インメモリでの動作時は設定をしなくても@Entityクラスからスキーマが自動生成されていました。
ファイル永続化にしたので自動生成の設定を追加する必要があります。
"update"の場合、アプリケーション起動時に@Entityに対応するテーブルが無ければ自動生成されます。
spring.jpa.hibernate.ddl-autoの設定値は以下の記事を参考にさせていただきました。
この状態で起動すると、登録時にlocalhostがRPに無いというエラーになります。
ファイル永続化したことで、server\src\main\resources\data.sql も実行されなくなっているためです。
H2データベースにコンソールでつないで、直接初期データを登録する必要があります。
cd server
gradlew bootRun
ブラウザで以下のURLにアクセスします。
http://localhost:8081/h2-console/
JDBC URL: に "jdbc:h2:.\line-fido2-db" を入力して"connect"ボタンを押下します。
※JDBC URLには server\src\main\resources\application-local.yml に設定したJDBC接続文字列を指定します。
※ログインできず"No suitable driver found for 08001/0"エラーが表示される場合、
LINE FIDO2 Server GitHubのREADMEに記載されているとおり、serverのbuild.gradleから
logbook-spring-boot-starterの行をコメントアウトしてビルドしてみてください。
SQL statement入力エリアに server\src\main\resouces\data.sql の内容をコピペして実行します。
RPテーブルにlocalhostが登録されます。
これで登録処理もでき、server(FIDO2 Server)を再起動しても認証情報が保持されます。