Сигнербокс

written on Saturday, July 12, 2014

Сигнербокс - это такое веб-приложение, которое позволяет подписывать данные и аутентифицироваться в браузере через цифровой сертификат, удостоверяющий личность.

К клиентскому сигнербоксу прилагается серверный демон, который подписи проверяет и выдает результат. Демон называется dstud. Готовая сборка лежит в ppa:ilya-muromec/dstud.

Сам сигнербокс хостится на домене eusign.org и работает по OAuth-like протоколу - получает запрос при переходе на страницу, показывает пользователю предложение авторизировать запрос и перебрасывает на обратно с готовым результатом.

Интеграция

Чтобы добавить проверку личности с помощью signerbox/dstud на сайт, нужно:

  • установить на своем хосте dstud-static из ppa:

    add-apt-repository ppa:ilya-muromec/dstud
    apt-get update
    apt-get install dstud-static
    
  • зарегистрировать свое приложение по адресу https://eusign.org/register_app и получить app_id.

  • установить интеграционный плагин для своего сайта или написать новый

  • указать в настройках плагина полученый app_id

Вордпресс

Сейчас у меня есть готовый плагин для ворпдесса, он живет по адресу https://github.com/themao/dstu-login . При регистрации приложения, нужно указать auth_url в виде https://:domain/wp-login.php. Принимаются только адреса со схемой https.

После того, как плагин настроен, на странице входа должна появится ссылка "Sign with eU".

Живое демо доступно по адресу https://dstu.enodev.org.

В разработке плагина принял участи @niggaslife

Как это работает

Сигнербокс запрашивает у пользователя доступ к приватному ключу и сертификату, после чего подписывает строку, содержащую доменное имя сайта и нонс и передает сайту полученную подпись, сертификат и нонс для проверки.

При этом приватный ключ пользователя не покидает броузер и не передается по сети, а сайту, интегрирующемося с сигнербоксом, нет необходимости доверять полученным данным, поскольку все проверки выполняются внутри dstud, установленном у него на хосте.

Насколько это безопасно

Сигнербокс не хранит ключи или пароли пользователей на сервере и использует HTTPS для передачи страницы и скриптов в браузер. При этом все же остается вектор атаки - если кто-то взломает сервер и подменит скрипты на нем.

Чтобы защититься от этой возможной проблемы, в будущем будет добавлена возможность работы с ключем через мобильное приложение.

Сертификация

По закону Украины об электронной подписи, юридически значимой является подпись, сделанная сертифицированным или прошедшим экспертизу ПО. Сигнербокс и используемые библиотеки не проходили сертификацию или экспертизу, поэтому, в случае судебного разбирательства вы можете иметь проблесы с тем, чтобы доказать связь между пользователем и личностью. Если вам это важно - помогите проекту пройти сертификацию или проконсультируйтесь с юристами.

Разработка плагинов

Написать свой интеграционный плагин достаточно просто. Для этого нужно сделать такие вещи:

  • в форме входа показывать ссылку на https://eusign.org/auth/:app_id?state=:app_state
  • добавить обработчик auth url, который считывает GET парметры sign, nonce, cert_id
  • скачать сертификат по адресу https://eusign.org/api/1/certificates/:cert_id
  • сформировать параметр data формата :nonce|:auth_url
  • отправить POST запрос на адрес http://localhost:8013/api/0/check с параметрами c (полученный сертификат), d (параметр data) и s (параметр sign).
  • при ответе 200 OK, распарсить результат, как набор строк key=value и создать пользователя, либо найти существующего

Поле 1.2.804.2.1.1.1.11.1.4.1.1 будет содержать уникальный идентификатор пользователя (ИНН). Поскольку данное поле содержит определнную информацию о пользователе, а не является синтетическим идентифиатором, рекуомендуется использовать его не в чистом виде, а хеш с солью от него.

Содержимое параметра state, указанного при аутентификации, может быть произвольным и возвращается без изменений обратно в auth_url. Рекомендуется указывать в нем одноразовый токен для защиты от CSRF.

Тестовые сертификаты

Для удобства разработки, вместе с демоном dstud распостраняются тестовый сертификат и ключ (user.cer и user.key). Чтобы разрешить вход по тестовому сертификату, нехобходимо остановить демон dstud и запустить его из каталога testCA.

Тестовый сертификат не содержит поля 1.2.804.2.1.1.1.11.1.4.1.1.

This entry was tagged code, crypto and dstu