Защита от MITM с TLS 1.3 и mTLS — пошагово
1. Устанавливаем инструменты
На Linux (Ubuntu/Debian):
---
2. Создаём свой корневой сертификат (CA)
---
3. Создаём сертификат сервера
---
4. Создаём сертификат клиента
---
5. Настраиваем Nginx на TLS 1.3 + mTLS
Редактируем /etc/nginx/sites-available/default:
Применяем:
---
6. Проверяем подключение
:small_blue_diamond: С клиентским сертификатом:
:small_blue_diamond: Без сертификата:
:point_right: Подключение будет отклонено (MITM не пройдёт, так как нет клиентского сертификата).
---
7. Проверяем Forward Secrecy
В поле Cipher будет указано ECDHE и AES_128_GCM, значит сессия использует динамический ключ.
1. Устанавливаем инструменты
На Linux (Ubuntu/Debian):
sudo apt update
sudo apt install openssl nginx -y
---
2. Создаём свой корневой сертификат (CA)
# Генерация ключа CA
openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:4096
# Самоподписанный сертификат CA
openssl req -x509 -new -key ca.key -sha256 -days 3650 -out ca.crt \
-subj "/C=RU/ST=Moscow/L=Moscow/O=MyOrg/OU=Security/CN=MyRootCA"
---
3. Создаём сертификат сервера
# Приватный ключ сервера
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
# Запрос на сертификат
openssl req -new -key server.key -out server.csr \
-subj "/C=RU/ST=Moscow/L=Moscow/O=MyOrg/OU=IT/CN=server.local"
# Подписываем у CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365 -sha256
---
4. Создаём сертификат клиента
# Приватный ключ клиента
openssl genpkey -algorithm RSA -out client.key -pkeyopt rsa_keygen_bits:2048
# Запрос на сертификат
openssl req -new -key client.key -out client.csr \
-subj "/C=RU/ST=Moscow/L=Moscow/O=MyOrg/OU=Client/CN=myclient"
# Подписываем у CA
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
-out client.crt -days 365 -sha256
---
5. Настраиваем Nginx на TLS 1.3 + mTLS
Редактируем /etc/nginx/sites-available/default:
}server {
listen 443 ssl http2;
server_name server.local;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_protocols TLSv1.3;
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384;
# Взаимная аутентификация
ssl_client_certificate /etc/nginx/ca.crt;
ssl_verify_client on;
location / {
root /var/www/html;
index index.html;
}
Применяем:
sudo nginx -t
sudo systemctl restart nginx
---
6. Проверяем подключение
:small_blue_diamond: С клиентским сертификатом:
curl -vk --key client.key --cert client.crt https://server.local/
:small_blue_diamond: Без сертификата:
curl -vk https://server.local/
:point_right: Подключение будет отклонено (MITM не пройдёт, так как нет клиентского сертификата).
---
7. Проверяем Forward Secrecy
openssl s_client -connect server.local:443 -tls1_3
В поле Cipher будет указано ECDHE и AES_128_GCM, значит сессия использует динамический ключ.
👍47
👏8
🤔9
💯6
LIMB