SSL Cert Auth

Первая часть (про nginx) взята здесь: http://devimpress.com/archives/659, автор - Максим Крентовский. Иногда для некоторых систем (например, банковских) наличие пары «логин-пароль» не является достаточно надежным средством аутентификации, поэтому обычно используют то, что посильнее и поддерживается любым браузером, а именно — SSL-сертификаты. Выданный пользователю сертификат импортируется в цепочку ключей рабочей системы и при осуществлении входа в приложение производится его выбор в качестве элемента идентификации пользователя.

OpenSSL setup SHA256

Прежде, чем гнуть пальцы, надо правильно настроить openssl, чтобы он использовал приличное шифрование SHA256, а не босяцкое SHA1. Делается это в настройках Openssl:

cat /etc/openssl.cnf
[ CA_default ]
default_md  = sha256    # Change from sha1
...
[ req ]
req_extensions = v3_req     # Uncomment

Теперь у центров сертификации будут запрашиваться серты SHA256, а самопальные серты, несмотря на их самоподписанность, не будут выглядеть лажово.

Иногда, если лениво лезть в настройки openssl, то можно заставить openssl использовать SHA256, если в команду вставлять ключ -sha256. Это будет выглядеть вот так (например):

openssl req -out CSR.csr -sha256 -new -newkey rsa:2048 -nodes -keyout private/www-server8.key

И будет создан CSR на подписание его SHA256 (иначе openssl запросит серт по умолчанию, то есть SHA1)

CA Key, CA Cert

Для того, чтобы нам начать выдавать сертификаты пользователям нашей системы, необходимо сформировать корневую пару ключей (CA) и сертификат сервера, который также будет проверятся на клиентской стороне. Это делается следующей последовательностью команд:

#!/bin/bash
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 1095 -key ca.key -out ca.crt

Соответственно, полученный CA.crt может быть импортирован на стороне клиента как доверенный корневой сертификат, что избавит пользователей от назойливых предупреждений о нарушении безопасности на три года. :)

Server key, Server Cert

openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

Server.key и Server.crt будут использованы для конфигурации сервера, о чем еще поговорим. CSR можно удалять

User Certs

Теперь необходимо снабдить всех наших пользователей сертификатами, которые они будут использовать для аутентификации:

#!/bin/bash
openssl genrsa -out $1.key 1024
openssl req -new -key $1.key -out $1.csr
openssl x509 -req -days 365 -in $1.csr -CA ca.crt -CAkey ca.key -set_serial $2 -out $1.crt
openssl pkcs12 -export -out $1.pfx -inkey $1.key -in $1.crt -certfile ca.crt

На выходе получаем *.pfx, который можно отдавать пользователю (под честное слово). Единственный нюанс — параметр set_serial должно быть уникальным в рамках CA. Т.е. в нашем случае начиная с 02 (01 зарезервирован за сервером) и так далее.

Nginx Server Setup

Итак, все теперь имеют по сертификату и даже сумели установить их себе в браузеры (эту отдельную и очень непростую тему мы оставим на самостоятельное изучение). Осталось настроить наш любимый nginx таким образом, чтобы он пускал только доверенных пользователей и не пускал остальных. Это, в свою очередь, тоже не представляет особой сложности:

server {
    listen 443 ssl;
    server_name private.example.com;
    root /var/www/private;

    ssl_certificate /etc/nginx/certs/server.cer;
    ssl_certificate_key /etc/nginx/certs/server.pem;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    
    ssl_verify_client on;
}

Поздравляю. Почти все готово. Впрочем, если Вы ввели пароль для секретного ключа сервера — поздравляю вас, поскольку теперь при каждом перезапуске nginx-а необходимо будет оный пароль вводить. Вот такая вот безопасность.

Источники вдохновения:

Apache Server setup

В конфиг апача (./extra/httpd_vhosts.conf) вставляется такое:

## Client Verification
#   SSLVerifyClient on
    SSLVerifyClient optional
    SSLVerifyDepth 3
    SSLCADNRequestPath /etc/ssl/cert_issuer.domain/

# error handling
    RewriteEngine        on
    RewriteCond     %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
    RewriteRule     .? - [F]
    ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

При этом, в папке /etc/ssl/cert_issuer.domain/ нужны только сертификаты “Центра сертификации” - т.е. CA.crt, полученный на первом этапе и использовавшийся для создания “клиентских” сертификатов на втором этапе.

Пример реализации описан здесь: Аутентификация пользователя сайта по сертификату-Test with CGI

security_lab/openssl_cert_auth.txt · Last modified: 2015/10/12 10:41 by rybario
About this template
CC Attribution-Share Alike 4.0 International
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5