全部产品
  • 首页 > 
  • 关于SNI在HTTPS通信中应用的介绍

关于SNI在HTTPS通信中应用的介绍

KB: 40519

 · 

更新时间:2021-03-31 14:37

概述

对于同一IP绑定多域名的服务器来说,在服务器接收到HTTPS请求的同时,需要保证服务器和客户端都支持SNI协议,本文主要介绍了关于SNI(Server name indication)在HTTPS通信中应用的详细信息。

详细信息

SNI的介绍

随着IPv4地址的短缺,为了让多个域名复用一个IP,在HTTP服务器上引入了虚拟主机的概念。SNI最早在2004年被提出,目前主流的浏览器、服务器和测试工具都已支持SNI。服务器可以根据客户端请求中不同的Host将请求分发给本机中不同的虚拟主机来处理。但是,在被多个虚拟主机共享IP的HTTPS服务器中,在握手建立之前服务器无法知道客户端请求的具体Host,所以无法将请求交给特定的虚拟主机,从而导致服务器无法读取虚拟主机中配置的证书信息。SNI就是用来解决这个问题的,SNI是SSL和TLS的一个扩展协议。SNI要求客户端在与服务器握手时就携带需要访问的域名的Host信息,具体实现方法是在客户端“Client Hello”报文的请求头中,增加了Server Name的扩展字段,因此服务器便会知道需要用哪个虚拟主机的证书与客户端握手并建立TLS连接。

客户端支持SNI的必要性

在使用DDoS高防和WAF时,建议客户端支持SNI协议,其原因有以下两点:

  • 真实的DDoS高防IP和WAF服务器的数量是有限的,面对数以万计的域名无法实现一个域名一台物理服务器的配置,所以整个DDoS高防和WAF服务集群必然存在多个域名复用相同服务器的情况。因此,客户端必须通过支持SNI才能在与DDoS高防和WAF交互的同时,让DDoS高防或WAF清楚客户端请求的具体域名,从而调取对应的虚拟主机与客户端交互。
  • 当DDoS高防和WAF开启HTTPS协议时,如果客户端不支持SNI,那么客户端在与DDoS和WAF进行SSL握手时,DDoS和WAF就会返回默认证书,因此客户端就会返回“服务器证书不可信”的提示。
    说明:本章涉及的WAF是指国内的WAF,海外的WAF不支持SNI。

服务端和客户端支持SNI的方法

以下是在服务端和客户端支持SNI的方法。

服务端

关于如何配置您的服务器,使其能响应包含SNI的TLS请求,具体请参见以下文档:

客户端

建议您的用户使用新版本的浏览器,例如Google Chrome、Firefox等。

说明:如果默认您的用户使用不支持SNI的客户端时,DDoS作为代理需要配置四层端口转发。如果设置七层转发,那么当客户端发出HTTPS请求后,DDoS会返回DDoS默认的证书,客户端就会返回“服务器证书不可信”的提示。

SNI的兼容性

以下整理了关于SNI兼容性的信息,您可以根据操作环境参考相关内容。

说明:SNI兼容TLS 1.1及以上版本的协议,但与SSL协议不兼容。

  • 支持的桌面版浏览器:
    • Microsoft Edge所有版本
    • 2010年之后发行的Google Chrome版本。
    • Mozilla Firefox 2及以上版本
    • Internet Explorer 7及以上版本
      说明:支持Windows Vista、Windows Server 2008及以上版本操作系统。在Windows XP系统中,任何版本的IE浏览器都不支持SNI。
    • Konqueror 4.7及以上版本
    • Opera 8及以上版本
    • Safari 3.0及以上版本
      说明:仅支持Windows Vista、Windows Server 2008及以上版本和Mac OS X 10.5.6及以上版本操作系统。
  • 支持的手机端浏览器:
    • Android 3.0 Honeycomb及以上版本
    • iOS 4及以上版本
    • Windows Phone 7及以上版本
  • 支持的服务器:
    • Apache 2.2.12及以上版本
    • Apache Traffic Server 3.2.0及以上版本
    • Cherokee
    • HAProxy 1.5及以上版本
    • IIS 8.0及以上版本
    • Lighttpd 1.4.24及以上版本
    • LiteSpeed 4.1及以上版本
    • Nginx 0.5.32及以上版本
  • 支持的命令行:
    • cURL 7.18.1及以上版本
    • wget 1.14及以上版本
  • 支持的库:
    • GNU TLS
    • JSSE (Oracle Java) 7及以上版本
      说明:仅适用于客户端。
    • libcurl 7.18.1及以上版本
    • NSS 3.1.1及以上版本
    • OpenSSL 0.9.8j及以上版本
    • OpenSSL 0.9.8f及以上版本
      说明:需要配置flag。
    • Qt 4.8及以上版本

适用于

  • DDoS防护