NGINX SSL 리버스 프록시 업스트림 SSL 확인
하나의 IP 주소 만 사용하여 여러 웹 사이트를 호스팅하는 역방향 프록시로 NGINX 설정이 있습니다. 프록시에 Lets Encrypt 인증서가 있고 업스트림 서버에 다른 Lets Encrypt 인증서가 있습니다. 기본적으로 트래픽을 업스트림 서버로 전달하고 업스트림 서버에 유효한 TLS 인증서가 있는지 확인하려면 NGINX가 필요합니다. 을 비활성화 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)
답변
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
업스트림 서버 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 구성 파일에 대한 링크입니다.