NGINX의 기본 가상 호스트에 대해 여러 SSL 인증서를 제공하는 방법은 무엇입니까?

NGINX의 기본 가상 호스트에 대해 여러 SSL 인증서를 제공하는 방법은 무엇입니까?

Amazon S3에 NGINX 프록시를 통해 제공되는 정적 앱이 있습니다. 제가 프록시를 사용하는 목적은 사용자가 자신의 도메인을 내 Amazon EC2 인스턴스( 를 가리키는 CNAME 레코드를 통해 custom-domain.myproduct.com)로 지정하여 다음과 같은 사용자 지정 URL을 통해 내 앱에 액세스할 수 있도록 하는 것입니다 myproduct.happyclient.com.

이를 달성하기 위해 다음과 같은 nginx 구성이 있습니다(간결함을 위해 일부가 제거됨).

http {
    server {
    # This is my default route. References:
    # http://stackoverflow.com/a/15799883/91403
    # http://nginx.org/en/docs/http/request_processing.html

    listen 80 default_server;
    server_name custom-domain.myproduct.com;
    location / {
        proxy_pass http://static.myproduct.com; # points to Amazon S3
        proxy_set_header Host myproduct.com;
    }
}

내 정적 앱이 100% 공개(클라이언트 비밀은 없고 HTML과 자바스크립트만 있음)임에도 불구하고 일부 클라이언트는 SSL을 통해 액세스하려고 합니다. 호스트 헤더를 기반으로 SSL 연결에 사용할 인증서를 동적으로 선택하려면 어떻게 해야 합니까? 단순히 인증서 경로를 하드코딩할 수는 없습니다.

추신.: 클라이언트는 자신의 인증서를 내 인스턴스에 업로드할 수 있습니다.
PS2.: 이 설정은 이미 HTTP에서만 완벽하게 작동합니다.

내가 시도한 것

나는 성공하지 못한 채 다음과 같은 것을 시도했습니다.

server {
    listen 443 default_server;
    server_name custom-domain.myproduct.com;
    ssl on;
    ssl_certificate /etc/nginx/ssl/$http_host/server.crt; # note the http_host variable
    ssl_certificate_key /etc/nginx/ssl/$http_host/server.key; # also here
}

답변1

호스트 헤더를 기반으로 SSL 연결에 사용할 인증서를 동적으로 선택하려면 어떻게 해야 합니까?

Host 헤더는 HTTP 프로토콜의 일부이지만 HTTPS는 SSL 연결에 포함된 HTTP입니다. 이는 Host 헤더에 액세스하기 전에 먼저 SSL 연결(인증서가 필요함)을 설정해야 함을 의미합니다.

클라이언트가 SNI를 지원하는 경우(모든 최신 브라우저는 지원하지만 IE/XP는 지원하지 않음) 이미 SSL 핸드셰이크 내에서 대상 이름을 보냅니다. 대상 이름을 기반으로 다른 인증서를 제공하는 것은 일반적으로 nginx의 다른 서버 섹션에서 수행됩니다. 기본 섹션 내에서 사용하려고 할 수도 있지만 $ssl_server_name이것이 작동할지 확신할 수 없으며 이것이 작동하더라도 세션 캐싱과 같은 최적화에 부정적인 방식으로 영향을 미칠 수 있습니다.

관련 정보