Разработали страницу, где пользователь вводит данные для авторизации и выбирает из списка нужный сертификат. Приложение получает и подписывает ключ аутентификации с помощью плагина и вместе с данными для авторизации отправляет подписанный ключ для получения токена авторизации.
Задача
Разработка интеграционного модуля для API Честный Знак МДЛП (Мониторинг движения лекарственных препаратов). Сама документация API честного знака, хоть и не идеальна, но в целом вопросов не вызывает. В процессе разработки у нас возникло две основные проблемы: Авторизация в системе выполняется с использованием УКЭП (Усиленная квалифицированная электронная подпись).
Все запросы в API должны шифроваться по ГОСТ Р 34.10-2012 Опыта работы по авторизации с использованием УКЭП у нас не было. А про сертификат ГОСТ Р 34.10-2012 мы вообще слышали впервые, поэтому изначально чёткой картины реализации клиента к API честного знака не было.
Решение
Шифрование по ГОСТ Р 34.10-2012
Мы начали исследовать проблематику использования ГОСТ-алгоритмов шифрования. Наше приложение работает в Docker контейнере, поэтому основной задачей было найти способ создавать docker-образ с установленными шифрами ГОСТ.
«Использование docker-контейнеров при разработке является у нас стандартной практикой при разработке и передаче заказчику, для облегчения операций развертывания и масштабирования приложений. Это сильно упрощает работу системным администраторам и разработчикам.»
В результате исследования. Мы нашли и изучили подходящее решение, разработав на его основе своё. Так же нам необходимо было настроить использование новых шифров в питоне, точнее чтобы библиотека requests использовала нужные нам шифры.
Перечисляем список нужных шифров:
Пишем кастомный адаптер, который будет использовать эти шифры:
Теперь сессии будем создавать с использованием этого адаптера:
Теперь и у питона появился доступ к API честного знака!
Авторизация в системе выполняется с использованием УКЭП
Процесс авторизации в API выглядит следующим образом:
- Получаем код аутентификации
- Подписываем код аутентификации электронной подписью
- Отправляем подписанный код, получаем в ответ токен авторизации
В идеале нужно, чтобы авторизация происходила автоматически, и пользователю не приходилось ничего делать. В таком случае клиенту пришлось бы давать нам доступ к своей УКЭП, а это очень небезопасно. Мы предложили не очень удобный, но более безопасный вариант: в нашем приложении будет страничка, где пользователь будет вводить данные для авторизации (секретный ключ и т.п.) и выбирать сертификат, которым нужно подписать код аутентификации.
Для авторизации на сайте самого честного знака требуется браузерное расширение КриптоПро CSP, поэтому следующим шагом было научиться его использовать, в официальной документации КриптоПро CSP мы нашли демо-страничку, где можно протестировать создание подписи, на основе которой мы смогли разобраться с примером использования расширения в собственном приложении.
На текущий момент исследование этой странички уже не актуально, так как появилась специальная библиотека для работы с расширением КриптоПро, это будет в разы более удобный вариант.
Результат
В итоге получилась страничка, где пользователь вводит данные для авторизации и выбирает из списка нужный сертификат. Приложение получает и подписывает ключ аутентификации с помощью плагина, и вместе с данными для авторизации отправляет подписанный ключ для получения токена авторизации.
Мы смогли реализовать авторизацию с помощью ГОСТ-шифрования в МДЛП с помощью python и java script и получили возможность для работы с API.