何回か続けてきたFIDOデバイスエミュレータはこれが最後です。
・WebAuthnを使ったFIDOサーバを立ててみた
本物のFIDOデバイスをお持ちであれば、この投稿だけでも参考になります。
・FIDOデバイスエミュレータを作成してみた。。。が
仮想的なFIDOデバイスをサーバに配置しようという野望です。
・FIDOデバイスエミュレータを作成してみた(だけどもうちょっと。)
Arduinoを使って、ブラウザとFIDOデバイスエミュレータの橋渡しをしました。
・FIDOデバイスエミュレータようやく完成
この投稿の続編です。この投稿でうまく動かなかったところを直してようやく完成しました。
試行錯誤しながらも、ある程度の完成度まで仕上げられましたが、結局のところ、完成にはできませんでした。(※追記 この記事時点のことで、結局完成しました!)
上記の投稿ですでに編集済みですが、x509証明書が、FIDO Allianceに登録されていないためと、最終的に判断しました。
FIDOのプロトコルだけでなく、Passkey認証付きBLEペリフェラル、x509証明書など、多岐にわたるノウハウを獲得できました。今回の主要な目的の一つでしたので良かったと思っています。
最後の最後で行った修正を記録しておきます。
#x509v3証明書にする
x509証明書の作成には以下を使っていました。
・Junkurihara/js-x509-utils
https://github.com/junkurihara/js-x509-utils
しかしながら、v3には対応していないため、急遽以下のnpmモジュールに変更しました。
・jsrsasign
https://kjur.github.io/jsrsasign/
これでv3にはなりました。fido2-libのコメントアウトも解除できました。
ですが、Chromeはエラーを吐いていましたので、さらに、本物のFIDOデバイスから抜き出したx509証明書との違いを探してみました。以下の2つで差分がありました。
・サブジェクトキー識別子
・FIDO U2F certificate transports extension
サブジェクトキー識別子が何なのかがわかりませんでした。一般にHashらしく、それっぽく入れてみたのですがだめでした。コード上ではコメントアウトしています。
FIDO U2F certificate transports extension は、以下の仕様書に記載がありました。
FIDO U2F Authenticator Transports Extension
結局x509証明書作成の部分は、以下のようなコードになりました。
(有効期限が固定値だったりと、力尽きてる感がありますが。。。)
// X.509証明書の作成
var tbsc = new rs.KJUR.asn1.x509.TBSCertificate();
tbsc.setSerialNumberByParam({'int': 1234});
tbsc.setSignatureAlgByParam({'name': 'SHA256withECDSA'});
tbsc.setIssuerByParam({'str': "/CN=FT FIDO 0200"});
tbsc.setNotBeforeByParam({'str': "190511235959Z"});
tbsc.setNotAfterByParam({'str': "340511235959Z"});
tbsc.setSubjectByParam({'str': "/CN=FT FIDO P2000000000000"});
tbsc.setSubjectPublicKey(kp.pubKeyObj);
/*
//サブジェクトキー識別子
var extSKI = new rs.KJUR.asn1.x509.Extension();
extSKI.oid = '2.5.29.14';
const ski = rs.KJUR.crypto.Util.hashHex(kp_cert.pubKeyObj.pubKeyHex, 'sha1');
const derSKI = new rs.KJUR.asn1.DEROctetString({ hex: ski });
extSKI.getExtnValueHex = () => {return derSKI.getEncodedHex() };
tbsc.appendExtension(extSKI);
*/
// FIDO U2F certificate transports extension
var extSKI2 = new rs.KJUR.asn1.x509.Extension();
extSKI2.oid = '1.3.6.1.4.1.45724.2.1.1';
extSKI2.getExtnValueHex = () => { return "03020640" };
tbsc.appendExtension(extSKI2);
var cert = new rs.KJUR.asn1.x509.Certificate({'tbscertobj': tbsc, 'prvkeyobj': kp_cert.prvKeyObj });
cert.sign();
var attestationCert = Buffer.from(cert.hTLV, 'hex');
#FIDO仮想デバイスの通信バッファサイズを変更
X509証明書をv3にしたからなのか、通信サイズが少し大きくなって、バッファオーバーフローが発生しました。
Arduinoのソースコードで、通信バッファサイズを2倍にしました。
#結果
だめでした。状況変わらずです。
以下のブラウザ画面です。何回見させられたことか。。。。
このダイアログはChromeが出しているわけではなく、OSが出しているように思えます。Firefoxでも同じ表示だったためです。
#最後に
ここまでご参照いただきありがとうございました。