Skip to content

10.1 TLS and mTLS

Создаем TLS-сертификаты

openssl req -new -x509 -days 365 -nodes -out nginx_cert.crt -keyout nginx_cert.key -subj "/CN=localhost"
  • new: В контексте этой команды он используется для создания нового самоподписанного сертификата.
  • x509: Этот флаг указывает OpenSSL создать самоподписанный сертификат X.509 вместо CSR.
  • days 1461: Этот параметр указывает срок действия сертификата в днях.
  • nodes: Этот флаг указывает OpenSSL не шифровать приватный ключ.
  • subj "/CN=pk.nginx": Объект, которому выдан сертификат. Это может включать в себя имя организации, доменное имя (Common Name) или другие идентификаторы, которые указывают на то, кому предназначен сертификат. В контексте SSL/TLS, Subject обычно относится к имени компании или домену, защищаемому сертификатом

Теперь можно добавить сертификаты в конфиг nginx.conf

events { worker_connections 1024; }

http {
    server {
        listen 443 ssl;

        ssl_certificate     nginx_cert.crt;
        ssl_certificate_key nginx_cert.key;

        location / {
            return 200 'Hello, world!';
        }
    }
}

Запускаем nginx

docker run -d -p 443:443 --name nginx -v $(pwd)/nginx/:/etc/nginx/ nginx:latest

1
2
3
curl --cacert nginx/nginx_cert.crt https://localhost:443

Hello, world!

Сформируем ключ для центра сертификации

openssl req -newkey rsa:2048 -x509 -nodes -keyout ca.key -days 3650 -subj "/CN=ca.pk.nginx" -out ca.crt

Добавить сертификат в конфиг

1
2
3
4
5
6
server {
    ...
    ssl_client_certificate /etc/ssl/client/ca.crt;
    ssl_verify_client on;
    ...
}

docker run -d -p 443:443 --name nginx -v $(pwd)/nginx/:/etc/nginx/ -v $(pwd)/cacert/:/etc/ssl/client/ nginx:latest

Создадим файл запроса сертификата

Файл CSR (Certificate Signing Request) содержит открытый ключ клиента и информацию, которую клиент хочет включить в свой сертификат (например, имя организации, страна, местоположение и т.д.). CSR отправляется в ЦС для получения сертификата.

openssl req -newkey rsa:2048 -keyout client1.key -out client1.csr -nodes -days 365 -subj "/CN=client1"

Выдаем и заверяем сертификат ключом центра сертификации

1
2
3
4
openssl x509 -req -in client1.csr -out client1.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365

Certificate request self-signature ok
subject=CN = client1

Теперь можно сделать запрос с клиентским сертификатом

1
2
3
curl -k --key client1.key --cert client1.crt https://127.0.0.1:443

Hello, world!

Посмотреть данные сертификата

1
2
3
openssl x509 -in client1.crt -text -noout 

openssl x509 -in client1.crt -subject -issuer -noout

Проверить что сертификат подписан CA

1
2
3
openssl verify -CAfile cacert/ca.crt client1.crt

client1.crt: OK

Посмотреть информацию о всех сертификатах в цепочке

openssl crl2pkcs7 -nocrl -certfile all_certs.crt | openssl pkcs7 -print_certs -text -noout | grep -E "(Certificate:)|(Issuer:)|(Subject:)"