NGINX + SSL = POWER!
используемые сервера:
5.9.109.104 / 192.168.10.13 (kolibri)
5.9.109.105 / 192.168.10.1 (gateway) (он же https://enter.taxiwest.ru)
Для удобства, будем их называть бакэнд (kolibri) и фронтэнд (gateway).+
**BACKEND** ''5.9.109.104 / 192.168.10.13 (kolibri)''
Этот сервер используется для генерации и подписи клиентских сертификатов.
Все скрипты и сертификаты лежат в ''/etc/nginx/ssl''
//
Описание файлов.//
''ca.config'' - конфиг для **OpenSSL**
''ca.crt'' - самоподписанный сертификат. Необходим для подписи клиентских сертификатов.
**''certgen_cl.sh''** - скрипт для генерации и подписи клиентских запароленых сертификатов. Использование:
Usage: ./certgen_cl.sh keyname city unit name e-mail password
После его использование - в директории ''/etc/nginx/ssl'' появился три файла с расширениями ''.key .crt .p12''
''%certname.p12%'' - это и есть **PKCS#12**-сертификат, который необходимо скормить браузеру пользователя.
''**revoke.sh**'' - скрипт для отзыва клиентских сертификатов.
Кушает в качестве аргумента имя ключа.
К примеру, если у нас есть файл сертификата ''cert1.p12''
то для его отзыва нужно запустить ''revoke.sh cert1''
**ВАЖНО:** при отзыве сертификата - нужно скопировать crl.pem (список отозванных сертификатов) на фронтэнд и релоднуть nginx (service nging reload), иначе - фронтэнд будет "проксировать" на бакэнд клиентов с "отозванными" сертификатами.
''server.csr'' - сертификат для **NGINX**
''server.crt'' - подписанный сертификат для **NGINX**
''server.nopass.key'' - беспарольная копия сертификата для **NGINX**
''crl.pem'' - Certificate Revocation List - список отзыва сертификатов. В нем перечисляются все отозванные клиентские сертификаты.
**FRONTEND** ''5.9.109.105 / 192.168.10.1 (gateway)''
Этот сервер используется для авторизации клиента и проверки клиентского сертификата на действительность и подпись.
Он используется как прокси сервер для работы с бакэндом.
Если посмотреть на нем конфиг nginx'а - то можно вдуплить что к чему:
server {
listen *:443;
server_name enter.taxiwest.ru;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.nopass.key;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_crl /etc/nginx/ssl/crl.pem;
ssl on;
location / {
proxy_pass http://192.168.10.13/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /var/log/nginx/enter.taxiwest.ru/enter.taxiwest.ru.access.log;
error_log /var/log/nginx/enter.taxiwest.ru/enter.taxiwest.ru.error.log error;
root /var/www;
charset cp1251;
index index.php;
rewrite_log on;
autoindex off;
client_max_body_size 100m;
keepalive_timeout 70;
fastcgi_param SSL_VERIFIED $ssl_client_verify;
fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial;
fastcgi_param SSL_CLIENT_CERT $ssl_client_cert;
fastcgi_param SSL_DN $ssl_client_s_dn;
}
Nginx использует для проверки подписи клиентских сертификатов файл ca.crt,
server.crt и server.nopass.key
/etc/nginx/ssl/crl.pem - используется для проверки сертификата на валидность. Следовательно, если клиент будет стучаться на фронтэнд с отозванным сертификатом - энджик его дропнет.