基于域名的HTTPS服务器
多个HTTPS服务器配置为侦听单个IP地址
时,常会遇到问题。先使用证书建立连接再传输server_name,也就是无法通过匹配server_name选择某个server,
此时将使用default_server的证书建立连接
这是由SSL协议本身的行为引起的。在浏览器发送HTTP请求之前建立SSL连接,并且NGINX不知道所请求服务器的名称。因此,它可能只提供默认服务器的证书。
解决方法
- 使用不同IP地址
- 使用通配证书,或者多域名证书
- 启用TLS-SNI扩展
如果复用端口(443)不设置默认证书(即便不同域名)可能导致无法访问,或者由于未定义证书导致Nginx启动失败
服务器名称指示
在单个IP地址上运行多个HTTPS服务器的更通用的解决方案是TLS服务器名称指示 (SNI)扩展(RFC 6066),它允许浏览器在SSL握手期间传递请求的服务器名称。使用此解决方案,服务器将知道它应该用于连接的证书。但是,SNI的浏览器支持有限。目前,从以下浏览器版本开始支持它:
- Opera 8.0
- MSIE 7.0(但仅适用于Windows Vista或更高版本)
- Firefox 2.0和其他使用Mozilla Platform rv:1.8.1的浏览器
- Safari 3.2.1(Windows版本支持Vista或更高版本的SNI)
- Chrome(Windows版本也支持Vista或更高版本的SNI)
参考链接: NGINX SSL Termination