我在 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
在默认部分中使用,但我不确定这是否会起作用,即使这有效,也可能会以负面的方式影响会话缓存等优化。