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 для передачи страницы и скриптов в браузер. При этом все же остается вектор атаки - если кто-то взломает сервер и подменит скрипты на нем.
Чтобы защититься от этой возможной проблемы, в будущем будет добавлена возможность работы с ключем через мобильное приложение.
По закону Украины об электронной подписи, юридически значимой является подпись, сделанная сертифицированным или прошедшим экспертизу ПО. Сигнербокс и используемые библиотеки не проходили сертификацию или экспертизу, поэтому, в случае судебного разбирательства вы можете иметь проблесы с тем, чтобы доказать связь между пользователем и личностью. Если вам это важно - помогите проекту пройти сертификацию или проконсультируйтесь с юристами.
Написать свой интеграционный плагин достаточно просто. Для этого нужно сделать такие вещи:
Поле 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.