Как мне использовать FIDO U2F, чтобы позволить пользователям аутентифицироваться на моем веб-сайте?

Учитывая все недавние шумихи вокруг спецификации FIDO U2F, я хотел бы реализовать FIDO U2F на тестовом стенде, чтобы быть готовым к предстоящему выпуску окончательной спецификации.

Пока что у меня есть ключ безопасности FIDO U2F, созданный Yubico, и расширение FIDO U2F (Universal 2nd Factor), установленное в Chrome. Мне также удалось настроить ключ безопасности для работы с моим входом в Google.

Я не знаю, как использовать это на моем собственном сайте. Я просмотрел страницу Google Github для проекта U2F и проверил их интерфейс веб-приложения. Выглядит очень просто (только JavaScript). Итак, реализация второго фактора аутентификации с FIDO так же проста, как реализация нескольких вызовов 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;             
      });

Но как я могу использовать это для реализации самостоятельно? Смогу ли я использовать обратный вызов из этого вызова метода для регистрации пользователя?


person 761838257287    schedule 29.10.2014    source источник


Ответы (2)


Что вы пытаетесь сделать, так это реализовать так называемую «полагающуюся сторону», что означает, что ваш веб-сервис будет полагаться на подтверждение личности, предоставляемое токеном FIDO U2F.

Для этого вам необходимо знать спецификации U2F. В частности, как должна быть реализована парадигма «вызов-ответ» и как работают идентификаторы и фасеты приложений. Это подробно описано в спецификации.

Вы правы: фактический код, необходимый для работы с FIDO U2F из внешнего интерфейса вашего приложения, почти тривиален (то есть, если вы используете «высокоуровневый» JavaScript API, а не «низкоуровневый» MessagePort API) . Однако вашему приложению необходимо будет работать с сообщениями, сгенерированными токеном, и проверять их. Это нетривиально.

Чтобы проиллюстрировать, как можно реализовать сайт проверяющей стороны, я приведу несколько примеров кода, взятых из Virtual FIDO U2F Token Extension, который я запрограммировал недавно по академическим причинам. Вы можете увидеть страницу с полным примером кода.


Прежде чем ваши пользователи смогут использовать свои токены FIDO U2F для аутентификации, им необходимо зарегистрировать его у вас. Чтобы они могли это сделать, вам нужно вызвать window.u2f.register в их браузере. Для этого вам нужно указать несколько параметров (опять же; подробности читайте в спецификации). Среди них проблема и id вашего приложения. Для веб-приложения этот id должен быть веб-источником веб-страницы, запускающей операцию FIDO. Предположим, это 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. Сертификат - вам необходимо проверить, доверяете ли вы этому сертификату и ЦС.
  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. Вам также необходимо убедиться, что подписанная строка является подходящей.

После того, как вы выполнили эти проверки, вы можете считать пользователя аутентифицированным. Краткий пример реализации кода на стороне сервера для этого также содержится на моем сервере пример.

person mritz_p    schedule 29.10.2014
comment
Обратите внимание, что Chrome требует, чтобы appId был https, он вернет код ошибки, если используется http. Обходные пути описаны в справочном коде Chrome по адресу github.com/google/ - person Les Nightingill; 20.08.2016

Недавно я написал инструкции для этого, а также список всех серверных библиотек U2F (большинство из них объединяет полностью рабочий демонстрационный сервер) по адресу developers.yubico.com/U2F. Цель состоит в том, чтобы позволить разработчикам реализовать / интегрировать U2F без необходимости читать спецификации.

Отказ от ответственности: я работаю разработчиком в Yubico.

person minisu    schedule 31.10.2014
comment
Вы знаете, существуют ли клиентские библиотеки? Например, для создания эмулятора Yubico Fido. - person Muis; 02.12.2014
comment
@Muis в терминологии FIDO, клиент - это программное обеспечение, которое взаимодействует с устройством U2F. Если вы этого хотите, есть пара библиотек. Если вам нужна версия программного обеспечения устройства U2F, взгляните на virtual-u2f от mritz_p или классов программных клавиш, используемых в тестовых наборах серверных библиотек, упомянутых в моем исходном ответе. - person minisu; 03.12.2014