35

FIDO U2F 仕様に関する最近の話題を踏まえて、最終仕様の今後のロールアウトに備えて、テストベッドに FIDO U2F をテスト的に実装したいと考えています。

これまでのところ、Yubico が作成した FIDO U2F セキュリティ キーと、Chrome にインストールされた FIDO U2F (Universal 2nd Factor) 拡張機能があります。また、Google ログインで機能するようにセキュリティ キーを設定することもできました。

今、自分のサイトでこのようなものを利用する方法がわかりません. U2F プロジェクトの Google の Github ページを調べ、Web アプリのフロントエンドを確認しました。とてもシンプルに見えます (JavaScript のみ)。では、FIDO を使用した 2 要素認証の実装は、JavaScript 呼び出しをいくつか実装するのと同じくらい簡単ですか? この例の登録で起こっているように見えるのは、次のことだけです。

      var registerRequest = {
            appId: enrollData.appId,
            challenge: enrollData.challenge,
            version: enrollData.version
      };

      u2f.register([registerRequest], [], function (result) {
          if (result.errorCode) {
        document.getElementById('status')
          .innerHTML = "Failed. Error code: " + result.errorCode;
        return;
          }
          document.location = "/enrollFinish"
          + "?browserData=" + result.clientData
          + "&enrollData=" + result.registrationData
          + "&challenge=" + enrollData.challenge
          + "&sessionId=" + enrollData.sessionId;             
      });

しかし、それを自分で実装するにはどうすればよいでしょうか? このメソッド呼び出しからのコールバックをユーザー登録に使用できますか?

4

2 に答える 2

53

あなたがしようとしているのは、いわゆる「証明書利用者」を実装することです。つまり、Web サービスは FIDO U2F トークンによって提供される ID アサーションに依存します。

そのためには、 U2F 仕様を理解する必要があります。特に、チャレンジ/レスポンス パラダイムを実装する方法と、アプリ ID とファセットがどのように機能するかについてです。これは仕様書に詳しく書かれています。

その通りです: アプリケーションのフロントエンドから FIDO U2F を操作するために必要な実際のコードは、ほとんど自明です (つまり、「低レベル」の MessagePort API ではなく「高レベル」の JavaScript API を使用する場合)。 . ただし、アプリケーションは、トークンによって生成されたメッセージを処理して検証する必要があります。これは簡単なことではありません。

証明書利用者サイトの実装方法を説明するために、学術的な理由で最近プログラムした仮想 FIDO U2F トークン拡張から抜粋したコード例をいくつか示します。完全なサンプル コードのページを参照できます。


ユーザーが FIDO U2F トークンを使用して認証を行う前に、トークンを登録する必要があります。window.u2f.registerこれを許可するには、ブラウザで呼び出す必要があります。そのためには、いくつかのパラメーターを指定する必要があります (繰り返しますが、詳細については仕様をお読みください)。その中には、課題とアプリのIDがあります。Web アプリの場合、このIDは、FIDO 操作をトリガーする Web ページの Web オリジンである必要があります。だとしましょうexample.org

window.u2f.register([
    {
        version : "U2F_V2",
        challenge : "YXJlIHlvdSBib3JlZD8gOy0p",
        appId : "http://example.org",
        sessionId : "26"
    }
], [], function (data) {

});

ユーザーが「ユーザー存在テスト」を実行すると (たとえば、トークンに触れることによって)、JSON オブジェクトである応答を受け取ります (詳細については、仕様を参照してください)。

dictionary RegisterResponse {
    DOMString registrationData;
    DOMString clientData;
};

このデータには、アプリケーションが処理する必要があるいくつかの要素が含まれています。

FIDO U2F 登録応答メッセージの登録マップ

  1. 生成されたキー ペアの公開キー -- 今後の認証に使用するために、これを保存する必要があります。
  2. 生成されたキー ペアのキー ハンドル -- 将来の使用のためにこれも保存する必要があります。
  3. 証明書 -- この証明書と CA を信頼するかどうかを確認する必要があります。
  4. 署名 -- 署名が有効かどうか (つまり、証明書に保存されているキーを確認するかどうか) と、署名されたデータが期待どおりのデータかどうかを確認する必要があります。

最近、この情報を抽出して検証する方法を示す Java による証明書利用者サーバーの大まかな実装ドラフトを作成しました。


登録が完了し、生成されたキーの詳細を保存したら、リクエストに署名できます。

あなたが言ったように、これは高レベルの JavaScript API を介して簡単に開始できます。

window.u2f.sign([{
    version : "U2F_V2",
    challenge : "c3RpbGwgYm9yZWQ/IQ",
    app_id : "http://example.org",
    sessionId : "42",
    keyHandle: "ZHVtbXlfa2V5X2hhbmRsZQ"
}], function (data) {

});

ここでは、登録時に取得したキーハンドルを提供する必要があります。繰り返しますが、ユーザーが「ユーザー存在テスト」を実行した後 (トークンに触れるなど)、JSON オブジェクトである応答を受け取ります (詳細については、仕様を参照してください)。

dictionary SignResponse {
    DOMString keyHandle;
    DOMString signatureData;
    DOMString clientData;
};

ここに含まれる署名データを検証する必要があります。

FIDO U2F認証応答メッセージの登録マップ

  1. 署名が以前に取得した公開鍵と一致することを確認する必要があります。
  2. また、署名された文字列が適切であることを検証する必要があります。

これらの検証を実行したら、ユーザーが認証されたと見なすことができます。そのためのサーバー側コードの簡単な実装例は、私のサーバーの例にも含まれています。

于 2014-10-29T20:44:45.993 に答える
24

私は最近、developers.yubico.com/U2F で、すべての U2F サーバー ライブラリ(それらのほとんどは、完全に機能するデモ サーバーをバンドルしています) のリストと同様に、これに関する説明を書きました。目標は、開発者が仕様を読まなくても U2F を実装/統合できるようにすることです。

免責事項: 私は Yubico で開発者として働いています。

于 2014-10-31T07:41:58.803 に答える