У меня настроен NGINX как обратный прокси-сервер для размещения нескольких веб-сайтов с использованием только одного IP-адреса. У меня есть сертификат Lets Encrypt на прокси-сервере и другой сертификат Lets Encrypt на сервере восходящего потока. По сути, мне нужно, чтобы NGINX перенаправлял трафик на сервер восходящего потока и проверял, что у сервера восходящего потока есть действительный сертификат TLS. Если я отключу proxy_ssl_verify
, это будет работать. Если я перейду https://app.local.example.com
на свою внутреннюю сеть, приложение работает нормально.
Диаграмма сети:
https://app.example.com --> NGINX Reverse Proxy --> https://app.local.example.com (Local IP Address)
Файл конфигурации обратного прокси-сервера NGINX:
server {
listen 80;
rewrite ^ https://$host$request_uri? permanent;
}
server {
server_name app.example.com;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/app.example.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/app.example.com/chain.pem;
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-HTTPS on;
proxy_ssl_session_reuse off;
proxy_ssl_name app.local.example.com
proxy_ssl_verify on;
proxy_ssl_verify_depth 2; # I've tried 1,2,3,4
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_pass https://app.local.example.com
}
}
Вот сообщение об ошибке, которое я получаю.
[error] 1087#1087: *2 upstream SSL certificate verify error: (20:unable to get local issuer certificate) while SSL handshaking to upstream, client: [Client IP], server: app.example.com, request: "GET / HTTP/1.1", upstream: "https://192.168.1.5:443/", host: "app.local.example.com", referrer: "https://app.example.com/">
Версия OpenSSL:OpenSSL 1.1.1f 31 Mar 2020
nginx-v:nginx version: nginx/1.18.0 (Ubuntu)
кот /etc/issue:Ubuntu 20.04.1 LTS \n \l
Выходopenssl s_client -connect app.local.example.com:443
CONNECTED(00000003)
depth=0 CN = app.local.example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = app.local.example.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:CN = app.local.example.com
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFeDCCBGCgAwIBAgISA8NkbZ6wz2EnKcedXujKT9AmMA0GCSqGSIb3DQEBCwUA
...
-----END CERTIFICATE-----
...
SSL-Session:
Protocol : TLSv1.3
...
Verify return code: 21 (unable to verify the first certificate)
решение1
Certificate chain
0 s:CN = app.local.example.com
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
Ваш сервер настроен неправильно. Вместо отправки листового сертификата (app.local.example.com) и промежуточного сертификата он отправляет только листовой сертификат. Из-за отсутствия промежуточного сертификата не может быть создан путь доверия к локальному якорю доверия, что означает, что проверка сертификата завершается с ошибкой"не удалось получить сертификат локального эмитента". Браузеры часто обходят такие проблемы, получая отсутствующий промежуточный сертификат откуда-то еще, но другие стеки TLS обычно не используют такие обходные пути.
После того, как вы правильно настроили сервер, вы должны увидеть следующее в openssl s_client
. После этого nginx тоже должен работать.
Certificate chain
0 s:CN = app.local.example.com
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
i:O = Digital Signature Trust Co., CN = DST Root CA X3
решение2
Я изменил ssl_certificate
значение с cert.pem
на fullchain.pem
на вышестоящем сервере.
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/app.example.com/chain.pem;
Вот ссылка на файлы конфигурации NGINX, которые я использовал