TLS-сертификаты для авторизации в веб-приложения

Требования

В работе использую несколько веб-проектов, к которым у меня есть несколько требований:

  1. работа с веб-приложением осуществляется по протоколу https
  2. при заходе на веб-приложение избавиться от надоедливого предупреждения от броузеров о том, что сертификат на сайте не заверен центром сертификации
  3. кроме аутентификации по паролю, осуществлять доступ к веб-приложению на основе клиентского сертификата средствами веб-сервер nginx

Решение

Создание сертификатов

Для начала следует создать корневой сертификат и заполнить необходимую информацию

openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt

Теперь создадим на основе корневого сертификата свой клиентский сертификат (см. п.3 в Требованиях)

openssl genrsa -out bugreev-prjs.key 4096
openssl req -new -key bugreev-prjs.key -out bugreev-prjs.csr
openssl x509 -req -days 1826 -in bugreev-prjs.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out bugreev-prjs.crt

При заполнении информации поле «Common Name» должно совпадать с названием сайта в URL'е. Если сайтов несколько, то можно задать маску, например, *.bugreev.ru. В этом случае после импорта сертификатов в броузер, Требования будут выполняться для всех сайтов с URL'ом https://*.bugreev.ru/

Экспортируем связку клиентского сертификата/ключа в формате pkcs12

openssl pkcs12 -export -out bugreev-prjs.p12 -inkey bugreev-prjs.key -in bugreev-prjs.crt -certfile ca.crt

При экспорте необходимо задать пароль, в дальнейшем его необходимо будет ввести при импорте клиентского сертификата в ваш броузер.

Настройка Nginx

Допишем в конфигурацию виртуального хоста следующее

listen x.x.x.x:443 accept_filter=httpready ssl ;
server_name  xxxx;

## ssl
ssl_certificate /usr/local/etc/nginx/ssl/ca.crt;
ssl_certificate_key /usr/local/etc/nginx/ssl/ca.key;
ssl_client_certificate /usr/local/etc/nginx/ssl/bugreev-prjs.crt;
ssl_verify_client on;

ssl_session_timeout  1m;
ssl_protocols  SSLv2 SSLv3 TLSv1;
ssl_ciphers  HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers   on;

Перезапустим nginx

service nginx restart

Настройка броузера

  • для выполнения п.2 в Требованиях в броузере в настройках «Центры сертификации» необходимо импортировать корневой сертификат ca.crt
  • для выполнения п.3 в Требованиях в броузере в настройках «Свои сертификаты» необходимо импортировать клиентский сертификат bugreev-prjs.p12

Если не импортировать клиентский сертификат в броузер, то при заходе на веб-приложение nginx должен выдать ошибку: 400 Bad Request

Ссылки

Комментарии

 
blog/2014/05/14-tls-сертификаты_для_авторизации_в_веб-приложения.txt · Последние изменения: 2014/07/09 10:43 — Антон Бугреев · []