Nginx
March 22, 2023

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.