Сигнербокс — это такое веб-приложение, которое позволяет подписывать данные и аутентифицироваться в браузере через цифровой сертификат, связывающий личность с публичным ключем стандарта ДСТУ 4145-2002 (ширование на эллиптических кривых). Такие сертификаты бесплатно выдаются министерством доходов и сборов, а также коммерческими CA.
К клиентскому сигнербоксу прилагается серверный демон, который подписи проверяет и выдает результат. Демон называется dstud.
Готовая сборка лежит в ppa:ilya-muromec/dstud.
Сам сигнербокс хостится на домене eusign.org и работает по кастомному OAuth-like протоколу — получает запрос при переходе на страницу, показывает пользователю предложение авторизировать запрос и перебрасывает на обратно с готовым результатом.
Чтобы добавить проверку личности с помощью signerbox/dstud на сайт, нужно:
Сейчас у меня есть готовый плагин для ворпдесса, он живет по адресу github.com/themao/dstu-login. При регистрации приложения, нужно указать auth_url в виде https://:domain/wp-login.php. Принимаются только адреса со схемой https.
После того, как плагин настроен, на странице входа должна появится ссылка «Sign with eU».
Живое демо доступно по адресу dstu.enodev.org.
В разработке плагина принял участие юзер твиттера, скрывающийся под ником @niggaslife.
Пользователь редиректится на форму, которая запрашивает его ключ и сертификат, подписывает строку из NONCE и вашего домена, послего чего заливает публичный ключ (сертификат) на сервер и отправляет подпись в виде get-параметра обратно на сайт, иницироваший аутентификацию.
Создание подписи происходит на клиенте с помощью JS-библиотеки, поэтому приватный ключ не покидает машину.
Интегрирующемуся сайту не требуется доверять сигнербоксу, поскольку проверка подписи происходит у него, средствами демона «dstud».
По закону Украины об электронной подписи, юридически значимой является подпись, сделанная сертифицированным или прошедшим экспертизу ПО. Сигнербокс и используемые библиотеки не проходили сертификацию или экспертизу, поэтому, в случае судебного разбирательства вы можете иметь проблесы с тем, чтобы доказать связь между пользователем и личностью. Если вам это важно – помогите проекту пройти сертификацию или проконсультируйтесь с юристами.
Написать свой интеграционный плагин достаточно просто. Для этого нужно сделать такие вещи:
Поле 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.
К клиентскому сигнербоксу прилагается серверный демон, который подписи проверяет и выдает результат. Демон называется 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
- зарегистрировать свое приложение по адресу eusign.org/register_app и получить app_id.
- установить интеграционный плагин для своего сайта или написать новый
- указать в настройках плагина полученый app_id
Вордпресс
Сейчас у меня есть готовый плагин для ворпдесса, он живет по адресу github.com/themao/dstu-login. При регистрации приложения, нужно указать auth_url в виде https://:domain/wp-login.php. Принимаются только адреса со схемой https.
После того, как плагин настроен, на странице входа должна появится ссылка «Sign with eU».
Живое демо доступно по адресу dstu.enodev.org.
В разработке плагина принял участие юзер твиттера, скрывающийся под ником @niggaslife.
Как это работает
Пользователь редиректится на форму, которая запрашивает его ключ и сертификат, подписывает строку из NONCE и вашего домена, послего чего заливает публичный ключ (сертификат) на сервер и отправляет подпись в виде get-параметра обратно на сайт, иницироваший аутентификацию.
Создание подписи происходит на клиенте с помощью JS-библиотеки, поэтому приватный ключ не покидает машину.
Интегрирующемуся сайту не требуется доверять сигнербоксу, поскольку проверка подписи происходит у него, средствами демона «dstud».
Сертификация
По закону Украины об электронной подписи, юридически значимой является подпись, сделанная сертифицированным или прошедшим экспертизу ПО. Сигнербокс и используемые библиотеки не проходили сертификацию или экспертизу, поэтому, в случае судебного разбирательства вы можете иметь проблесы с тем, чтобы доказать связь между пользователем и личностью. Если вам это важно – помогите проекту пройти сертификацию или проконсультируйтесь с юристами.
Разработка плагинов
Написать свой интеграционный плагин достаточно просто. Для этого нужно сделать такие вещи:
- в форме входа показывать ссылку на eusign.org/auth:app_id?state=:app_state
- добавить обработчик auth url, который считывает GET парметры sign, nonce, cert_id
- скачать сертификат по адресу eusign.org/api/1/certificates:cert_id
- сформировать параметр data формата :nonce|:auth_url
- отправить POST запрос на адрес 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.