SSL auth
Здесь установим аутентификацию на сайте с помощью самоподписанных сертификатов. Такая схема работы используется в гос учреждениях.
1. Генерируем собственный корневой сертификат CA и приватный ключ для него.
2. Генерируем клиентский сертификат и подписываете его приватным ключом CA, выпущенным на первом шаге.
3. Указываем веб-серверу, что клиентские сертификаты должны быть подписаны ключом CA, выпущенным на первом шаге.
4. Клиенту устанавливается сертификат, полученный на втором шаге.
5. Когда клиент подключается к серверу - он стандартно проверяет сертификат сервера, но помимо этого еще и отправляет серверу свой сертификат.
6. Сервер принимает клиентский сертификат, генерирует хеш на основе данных в сертификате, а также, используя публичный ключ CA, расшифровывает подпись клиентского сертификата и достает записанный туда хеш. Если хеши совпадают - то сертификат клиента действительно выдан нашим CA, а значит, все ок и клиенту отправляется запрошенный документ.
1. Генерация закрытого ключа и сертификата CA в /etc/nginx/ssl:
openssl genrsa -out ca.key 2048 openssl req -x509 -new -key ca.key -days 10000 -out ca.crt
Вводим информацию о стране, городе, названия компании, владельце сертификата и его email.
2. Генерация закрытого ключа и запроса от клиента:
openssl genrsa -out client.key 2048 openssl req -new -key client.key -out client.csr
Вводим информацию о стране, городе, названия компании, владельце сертификата и его email.
3. Генерация сертификата клиента, подписываем клиентский сертификат сертификатом CA, полученным на этапе 1:
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt -days 5000
4. Если не хотим генерировать letsencrypt сертификат, то можно воспользоваться самоподписываемым:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx-selfsigned.key -out /etc/nginx/ssl/nginx-selfsigned.crt
Это сертификат для самого сервера. И никак с клиентскими не пересекается. Это разные сертификаты. Его можно заменить легальным сертификатом, полученным, например, от Let's Encrypt. Вводим информацию о стране, городе, названия компании, владельце сертификата и его email.
5. Чтобы установить в систему Windows экспортируем полученные ключи в систему PKCS12:
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
Здесь можем ввести пароль. Потом вводим пароль при инсталляции сертификата.
6. Копируем полученный на этапе 5 сертификат client.pfx на компьютер клиента
server { listen 80; server_name cameda.ru; index index.html; # Эта опция для получения сертификата от Let's Encrypt. location /.well-known{ root /opt/www/acme; } location / { return 301 https://$host$request_uri; } }
server { listen 443 ssl http2; server_name cameda.ru; index index.html; ssl_certificate /etc/letsencrypt/live/cameda.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/cameda.ru/privkey.pem; ssl_client_certificate /etc/nginx/ssl/ca.crt; ssl_verify_client on; location / { root /var/www/html; } }
Эти настройки вписываем, если используем для сервера самоподписываемый сертификат, генерируемый на этапе 4. Прописываем в настройках nginx:
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
Заметки.
1. В Google Chrome сертификат не подключился. Подключался с помощью IE.
2. Если сайт не видится, возможно его надо добавить в файл hosts.