基于域名的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