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.