NGINX SSL 역방향 프록시 업스트림 SSL 확인

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/문제: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 구성 파일에 대한 링크입니다.

관련 정보