阅读373 返回首页    go 阿里云 go 技术社区[云栖]


高防/WAF中SNI引发的https访问异常问题__运维问题_产品常见问题_DDoS 高防IP-阿里云

 

什么是SNI

 

, 随着,IPv4,地址的短缺,为了让多个域名复用一个,IP,地址,我们在,HTTP,服务器上引入了虚拟主机的概念,服务器可以根据客户端请求中不同的,host,来将请求交给不同的域名(虚拟主机)来处理。

,但在一个被多个域名(虚拟主机)共享,IP,的,HTTPS,服务器中,由于在握手建立之前服务器看不到客户端请求的是哪个,host,,所以无法将请求交给特定的虚拟主机;而要完成握手,又必须读取虚拟主机配置中的证书信息。SNI(,Server Name Indication,)就是用来解决这个看似矛盾的问题,它要求客户端在与服务器握手时就携带要访问域名的,host,信息,这样服务器就知道用哪个虚拟主机的证书去跟客户端握手并建立,TSL,连接了。

,SNI,最早在,2004年就提出了,目前主流的新版浏览器、服务器和测试工具都已支持,详情请参考最后一部分。

 

为什么高防/WAF中必须要求客户端支持SNI

 

,高防,/WAF,在反向代理,HTTPS,业务时,需要代理客户端去跟真实服务器(,RS,)交互,所以需要在配置,HTTPS,防护时上传证书和私钥。真实的高防和,WAF服务器,数量是有限的,对于用户上万的域名显然不可能满足一个域名一台物理服务器,,所以整个高防,/WAF,集群必然要多个域名复用相同的服务器,,这样就要求客户端必须支持,SNI,,才能正常与高防,/WAF,交互。

,当使用不支持,SNI,的浏览器访问高防,/WAF,防护的网站时,高防,/WAF,因不知道客户端请求的是哪个域名,无法调取对应的虚拟主机证书来跟客户端交互,只能使用内置的一个缺省证书去跟客户端握手,这时在客户端浏览器上会提示,“,服务器证书不可信,”,,如下图:

 ,

注意:即便RS只有一个域名(即没有复用IP),可以不需要支持SNI,但因为高防/WAF在中间反向代理,而客户端必须先与高防/WAF建立连接,所以还是需要客户端支持SNI的。

 

 Nginx/Apache的服务器端SNI实现

 

, 如需要配置服务器支持,SNI,,可参考这两篇文章:

,Nginx,:,https://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/

,Apache,:,https://www.ttlsa.com/apache/multi-https-virtual-host-apache-mod_gnutls/

 

客户端不支持SNI如何解决

 

, SNI,是一个很便利的扩展,随着,IPv4,地址的耗尽,全面支持,SNI,是趋势。对于不支持,SNI,的客户端,我们有两个解决方案:

,1.,  ,建议用户升级或使用新版本的浏览器,如,Chrome,、,Firefox,等(强烈推荐)

,2.,  ,在高防,不配置七层网站防护,只采用四层,443,端口转发(风险:无法防护,CC,攻击)

 

 常见的SNI支持情况

 

注意: SNI兼容TLS1.0及以上的协议,但不被SSL支持。

,桌面版浏览器支持

  • ,Chrome 5,及以上版本
  • ,Chrome 6,及以上版本(,Windows XP,)
  • ,Firefox 2,及以上版本
  • ,IE 7,及以上版本(运行在,Windows Vista/Server 2008,及以上版本版本系统中,,在,XP,系统中任何版本的,IE,浏览器都不支持,SNI,)
  • ,Konqueror 4.7 ,及以上版本
  • ,Opera 8 ,及以上版本
  • ,Safari 3.0 on Windows Vista/Server 2008 ,及以上版本,, or Mac OS X 10.5.6 ,及以上版本

 

,手机端浏览器支持

  • ,Android Browser on 3.0 Honeycomb ,及以上版本
  • ,iOS Safari on 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 ,及以上版本

 

最后更新:2016-07-12 13:53:02

  上一篇:go 新购买ECS或重置ECS后安全部署方法__技术分享_技术运维问题_漏洞扫描-阿里云
  下一篇:go 防御WordPress反射_阿里云帮助中心-阿里云,领先的云计算服务提供商