如何为NGINX上的默认虚拟主机提供多个SSL证书?

我在Amazon S3上有一个通过NGINX代理服务器的静态应用程序。 我使用代理的目的是允许用户将他们的域名指向我的Amazon EC2实例(通过指向custom-domain.myproduct.com CNAMElogging),以便他们可以通过自己的自定义url访问我的应用程序,如下所示: myproduct.happyclient.com

为了实现这一点,我有以下nginxconfiguration(为简洁起见,删除了部分):

 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和JavaScript),我的一些客户希望通过SSL访问它。 如何根据Host头dynamicselect使用哪个证书进行SSL连接? 请注意,我不能简单地硬编码证书path。

PS 。:客户将能够将他们的证书上传到我的实例
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 } 

如何根据Host头dynamicselect使用哪个证书进行SSL连接?

主机头是HTTP协议的一部分,但HTTPS是embedded到SSL连接中的HTTP。 这意味着您首先必须build立SSL连接(需要证书),然后才能访问主机头。

如果客户端支持SNI(所有现代浏览器都支持,但不支持IE / XP),它将在SSL握手中发送目标名称。 根据目标名称提供不同的证书通常由nginx中不同的服务器部分完成。 您可以尝试在默认部分中使用$ssl_server_name ,但我不确定这是否可行,即使这样做可能会影响会话caching等优化,但是会以负面方式影响会话caching。