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
|
| 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
|
Добавить сертификат в конфиг
| 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"
|
Выдаем и заверяем сертификат ключом центра сертификации
| 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
|
Теперь можно сделать запрос с клиентским сертификатом
| curl -k --key client1.key --cert client1.crt https://127.0.0.1:443
Hello, world!
|
Посмотреть данные сертификата
| openssl x509 -in client1.crt -text -noout
openssl x509 -in client1.crt -subject -issuer -noout
|
Проверить что сертификат подписан CA
| 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:)"
|