認証(Authentication)yubikeyFIDOCTAPはじめにこれはCTAPのお勉強をしたメモです。WebAuthn(ウェブオースン)ではなく、CTAP(シータップ)であります。Key)をゲットしました。今回はこれらの情報を使って認証をするお勉強メモです。セキュリティキー(青)※キーはリセットしてPINが設定されていないものを使います、PINを設定してしまうと、pinAuthの話をしないといけなくて、その話をするとすごく長くなるのでやめています。このコマンドに対応しています。※絵はこちらからピックアップさせていただきました。サンプルプログラム概要(assert.exe)assert.exeの処理シーケンスです。コマンドYubikey(Authenticator)内のクレデンシャル情報を取得するコマンドです。クレデンシャル情報とは、秘密鍵を持っていることを証明する情報で、Assertionと名付けられています。以下のパラメータを指定しています。false}ざっくりコマンド解説ここで書いたように、クレデンシャルはrpidをキーにして保存されています。rpidを指定さえすればAssertionをGETできるかというと、そうではないんです。allowListでCredentialIDも指定しないといけません。⇒rpidだけででAssertionをGETすることはできません。別の方法として、options.uv=trueにしてさらにpinAuth、pinProtocolを指定すると、CredentialIDの指定無しでAssertionをGETできます。これは登録時にrk=trueを指定してuser情報をYubikeyに保存していることが前提条件となります。allowListでCredentialIDを指定して取得する方法とallowList無しで取得する方法がある。allowListでCredentialIDを指定すると、CredentialIDに紐づいたAssertion(1個)をGETすることができる。allowList無しの場合は、登録時にrk=trueでuser情報をYubikeyに保存して登録されたAssertion(1個以上)をGETすることができる。allowList無しの場合はAssertionが複数個取れる場合があるので注意。clientDataHash⇒いわゆるチャレンジです。クレデンシャルを特定するためのパラメータではなく、GETしたクレデンシャルをVerifyするためのパラメータです。Identifierってことで、要はサーバーのドメインを指定します。authenticatorMakeCredentialの時に指定したものを指定する必要があります。試しに、"localhost"を"gebogebo.com"に変えてコマンドを送ってみると。(0x22)となり、エラーとなります。同じ要領で作成するのである、という理解が正解なのだけれども、もっとシンプルに考えて、乱数をSHA256(32byte)したchallenge、ということでも問題ないんだろうと思います。それで、Assertionにはこのchallengeの署名が返ってくるので、それをVerifyして真正性を確認するのです。allowListAllowListクレデンシャルを選択するためのパラメータです。仕様書にはallowCredentialDescriptorListと書いてあるのですが、どんな形式で何をしていするのか、明確な記載が見つかりません...とりあえず仕様書のEXAMPLEによるとこんな感じで、サンプルプログラムでも"type":"public-key"⇒固定値"id"⇒CredentialIDのバイナリデータをHEX変換した文字列をつっこんでいます。配列で複数個指定可能なのはallowListという名前で分かるのですが、クレデンシャルIDを指定するのに、typeにpublic-keyを指定するのが理解不能...options動作オプションです。仕様書よりピックアップサンプルasser.exeでは-pを指定するとup=trueで動作します。up=trueのときは、Yubikeyがピカピカ光ってタッチするとAssertionが返ってくるようになります。(ユーザーの存在確認)サンプルasser.exeでは-vを指定するとuv=trueで動作します。uvをtrueにしても、特に動作に変更はないのですが、後述のAssertionのFlagでuv結果を受け取ります。uvの指定値と結果値を見て、本当にuvされたかをチェックします。結果値のuvをtureにするためには、PIN認証が必要になり、芋づる式にpinAuth、pinProtocolの指定も必要になります。(ここはもしかしたらCTAPというよりもYubikeyの仕様なのかもしれません)3.Assertion(Response)コマンドのResponseのことです。仕様書等を見るとAssertionと名付けられています。Assertionは以下のデータから構成されます。h'3044022065E5E681837AEDE320D601BE7F82533976F437A5A1066B12EB4D1CAE870E7C32022035E160160AE4B014B81EDA0C264F1F8863A5D5C600EE8B482AB10E52DAC690CB'}Assertionについて#3のAttestationに比べたらだいぶマシです。取得したクレデンシャル情報です。GetしたクレデンシャルのIDですね。送信したコマンドのAllowListで指定したものと同じです。希望したものがとれたということで。data部が無く、以下の情報のみです。rpIdHashflagssignCountsignature署名です。Verifyに使います。4.Verify(検証)さて、Verifyです。Assertionが正しいものかどうか、Verifyします。基本的には#3と同じです。※大まかには#3と同じです。key署名対象データこの3つがそろえばVerifyできます。今回もコマンドでVerifyをやってみてお勉強したいと思います。以下の図はWebauthn仕様書。(こうやって署名されているよ、ってことです)◆SigAttestationのsignatureです。コマンドは正常に完了しました。key認証用公開鍵です。#3で作成したものです。いうファイル名で持っています。署名対象データですね。#3と同じ要領でassert_dgst.binを作成します。コマンドは正常に完了しました。◆Verify材料がそろったらopensslのコマンド一発です。OKおつかれさまでした基本的なところはなんとなくひととおりわかったきがする。upLoginユーザーは見つかりませんでした。