阿里云WAF与SNI问题
什么是SNI
当多个网站托管在一台服务器上并共享一个IP地址,并且每个网站都有自己的SSL证书,在客户端设备尝试安全地连接到其中一个网站时,服务器可能不知道显示哪个SSL证书。这是因为SSL/TLS握手发生在客户端设备通过HTTP指示连接到某个网站之前。这个有点像邮寄包裹到公寓楼而不是独栋房子。将邮件邮寄到某人的独栋房子时,仅街道地址就足以将包裹发送给收件人。但是,当包裹进入公寓楼时,除了街道地址外,还需要公寓号码。否则,包裹可能无法送达收件人或根本无法交付。
服务器名称指示(SNI,Server Name Indication)旨在解决此问题。 SNI是TLS协议(以前称为SSL协议)的扩展,该协议在HTTPS中使用。它包含在TLS/SSL握手流程中,以确保客户端设备能够看到他们尝试访问的网站的正确SSL证书。该扩展使得可以在TLS握手期间指定网站的主机名或域名,而不是在握手之后打开HTTP连接时指定。
SNI在2003年被添加为TLS/SSL的扩展;它最初不是协议的一部分。几乎所有的浏览器、操作系统和Web服务器都支持它,除了一些仍在使用的最旧的浏览器和操作系统。如果客户端或者浏览器不支持SNI,用户可能无法访问某些网站,将返回错误消息,例如"您的连接缺乏安全隐私。"
阿里云WAF对于SNI的支持
如下图,阿里云WAF支持多配置多个域名,并根据用户请求来返回对应域名的证书。同时阿里云有个默认证书,当无法确定证书的时候,就返回默认的证书。
对于共享型的WAF,默认返回的是阿里云的SSL证书;对于独享型的WAF,用户可以在控制台配置默认的证书。
这个对to-B的系统来说,会有一定的挑战。如果对方企业用的是比较老的SAP版本,可能http客户端不支持SNI,这样的话,共享版的WAF会返回默认的阿里云证书,客户端验证证书时候会报错。这种情况,可能就只能选择独享版WAF,毕竟用户可以自定义默认证书,将默认证书设置成所需要的证书即可。
另外,在更新SSL证书的时候,如果使用的是独享版WAF,除了更新所配置域名的证书以外,也要更新默认的证书。否则,由于旧的默认证书过期,对于不支持SNI的客户端,会出现验证证书的错误。
SNI兼容性
SNI支持以下桌面版浏览器:
- 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及以上版本,Mac OS X 10.5.6 及以上版本
SNI支持以下库:
- GNU TLS
- Java 7及以上版本,仅作为客户端
- HTTP client 4.3.2及以上版本
- libcurl 7.18.1及以上版本
- NSS 3.1.1及以上版本
- OpenSSL 0.9.8j及以上版本
- OpenSSL 0.9.8f及以上版本,需配置flag
- Qt 4.8及以上版本
- Python3、Python 2.7.9及以上版本
SNI支持以下手机端浏览器:
- Android Browser on 3.0 Honeycomb及以上版本
- iOS Safari on iOS 4及以上版本
- Windows Phone 7及以上版本
SNI支持以下服务器:
- Apache 2.2.12及以上版本
- Apache Traffic Server 3.2.0及以上版本
- HAProxy 1.5及以上版本
- IIS 8.0及以上版本
- lighttpd 1.4.24及以上版本
- LiteSpeed 4.1及以上版本
- nginx 0.5.32及以上版本
SNI 支持以下命令行:
- cURL 7.18.1及以上版本
- wget 1.14及以上版本
参考: