Как вы программируете веб-сайт для использования сертификата для аутентификации?

Моя компания рассматривает возможность использования карточных сертификатов (например, CAC) для аутентификации на веб-сайте; вместо того, чтобы пользователь вводил имя пользователя и пароль, эта информация была бы извлечена из сертификата. Как можно программировать интерфейс для передачи сертификата на веб-сервер? Я искал конкретные направления, но столкнулся со всем, кроме этого. Основная идея заключается в том, чтобы в конечном итоге подключиться к чему-то вроде LDAP для аутентификации, но часть браузера полностью ускользает от меня.

2 ответа

Решение

Вам на самом деле не нужно много делать на стороне клиента. Для веб-сайта браузер обрабатывает это для вас. Вам просто нужно настроить сервер так, чтобы ему требовался сертификат клиента, и браузер с ним справится. В Apache после настройки SSL-сертификата это так же просто, как настройка SSLVerifyClient required ( руководство) в конфигурации apache. Ваш сайт будет требовать сертификат клиента для доступа. Вы также можете установить SSLVerifyClient в optional который позволяет кому-то нажать "Отмена" при появлении запроса на выбор сертификата, и сайт все равно будет загружаться, но при этом отсутствуют переменные среды (см. ниже).

Если вы используете смарт-карты, вам может потребоваться драйвер для считывателя смарт-карт, который запрашивает у пользователя пин-код для запроса карты, но вам не нужно с этим обращаться. По моему опыту (с картами CAC), и Internet Explorer, и Firefox используют стороннее программное обеспечение (мы используем ActiveIdentity), чтобы запросить PIN-код пользователя (Firefox должен быть настроен для использования "Устройства безопасности", но это просто) и Chrome уже имеет встроенную поддержку для смарт-карт без отдельной программы. Также возможно установить сертификат в браузере, но я не работал с этим.

Что касается проверки пользователя, в Apache, после того, как рукопожатие SSL завершено браузером и сервером, в PHP есть несколько переменных среды, которые доступны (вы можете увидеть их на phpinfo() страница или если вы print_r($_SERVER), Они все SSL_* и включать такие вещи, как домен или общее имя). Это может отличаться в зависимости от того, какая информация была предоставлена ​​клиентом. Мы только что нашли тот, который имел уникальный идентификатор для карты $_SERVER['SSL_CLIENT_S_DN_CN'] и хранить это с каждой учетной записью. Затем мы можем использовать этот идентификатор для запроса учетной записи для создания подтвержденного сеанса пользователя.

Клиентские сертификаты SSL представлены в рукопожатии SSL, которое выполняется на нижних уровнях и поэтому прозрачно для внешнего интерфейса (браузер обрабатывает его внутри). Веб-сервер должен быть настроен на прием или запрос клиентских сертификатов, чтобы они запрашивались в рукопожатии SSL.

Затем сертификат клиента проверяется веб-сервером, и вы можете получить доступ к идентификатору клиента, как правило, через некоторый API, в зависимости от сервера / платформы.

РЕДАКТИРОВАТЬ: Вот руководство для nginx / PHP: http://nategood.com/client-side-certificate-authentication-in-ngi

Другие вопросы по тегам