Моя компания рассматривает использование сертификатов на основе карт (например, САС) для аутентификации на веб-сайте; вместо того, чтобы пользователь вводил имя пользователя и пароль, эта информация была бы извлечена из сертификата. Как программировать интерфейс, чтобы передать сертификат на веб-сервер? Я искал конкретные направления, но заканчивал все, кроме этого. По всей идее в конечном итоге подключиться к чему-то вроде LDAP для аутентификации, но часть браузера полностью ускользает от меня.Как вы программируете веб-сайт для использования сертификата для аутентификации?
ответ
Вы действительно не должны делать в пути на стороне клиента вещи. Для веб-сайта браузер обрабатывает его для вас. Вам просто нужно настроить сервер для получения сертификата клиента, и браузер обработает его. В Apache после настройки SSL-сертификата это так же просто, как установка SSLVerifyClient required
(manual) в конфигурации apache. Затем вашему сайту потребуется сертификат клиента для доступа. Вы также можете установить на номер optional
, который позволяет кому-то нажать «Отмена», когда будет предложено выбрать сертификат, и сайт все равно загрузится, но отсутствует переменные среды (см. Ниже).
Если вы используете смарт-карты, возможно, вам понадобится драйвер для считывателя смарт-карт, чтобы побудить пользователя к отправке PIN-кода, но это не то, что вам нужно обработать. По моему опыту (с картами CAC), Internet Explorer и Firefox используют стороннее программное обеспечение (мы используем ActiveIdentity), чтобы запросить PIN-код пользователя (Firefox нужно настроить для использования «устройства безопасности», но это просто) и Chrome уже встроил поддержку смарт-карт без отдельной программы. Также возможно установить сертификат в браузере, но я не работал с этим.
Как для проверки пользователя, в Apache, когда SSL рукопожатия материал был завершен браузером и сервером, в PHP есть несколько переменных окружения, которые доступны (вы можете увидеть их на phpinfo()
странице или если вы print_r($_SERVER)
Все они - SSL_*
и включают такие вещи, как домен или общее имя). Это может различаться в зависимости от того, какая информация была предоставлена от клиента. Мы только что нашли тот, который держал уникальный идентификатор для карты $_SERVER['SSL_CLIENT_S_DN_CN']
и сохранил это с каждой учетной записью. Затем мы можем использовать этот id для запроса учетной записи для создания проверенного сеанса пользователя.
Сертификаты SSL-клиентов представлены в SSL-квитировании, который выполняется в нижних слоях и поэтому прозрачен для интерфейса (браузер обрабатывает его внутренне). Веб-сервер должен быть настроен так, чтобы принимать или требовать сертификаты клиента, чтобы они запрашивались в SSL-квитировании.
Затем сертификат клиента проверяется веб-сервером, и вы можете получить доступ к идентификатору клиента, как правило, через некоторый API, в зависимости от сервера/платформы.
EDIT: Вот руководство для Nginx/PHP: http://nategood.com/client-side-certificate-authentication-in-ngi