如何为 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 和 javascript),但我的一些客户端仍希望通过 SSL 访问它。如何根据 Host 标头动态选择用于 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。这意味着您必须先建立 SSL 连接(需要证书),然后才能访问 Host 标头。

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

相关内容