欢迎您来到,李雷博客 | PHP博客        登录  |  注册

SNI: 实现多域名虚拟主机的SSL/TLS认证(绑定域名区分证书,再也不用端口区分)

更新:2018-04-27 09:39:23
人气:7621
来源:互联网转载
A+

能发现这篇软文的原因,在于我之前将自己的业务系统全部从http转向了https,但是发现apache不支持二级域名分别对应不同的域名证书,只能通过端口号来区分,如a.abc.com:443、b.abc.com:444、c.abc.com:445来区分不同https二级域名站点,这样的体验极其不好,总不让用户带着端口号敲地址吧。但是当时通过网上搜索解决方案,也只找到了这个办法,但是后来发现这篇文章,原来是自己apache版本是2.2.8,是服务器不支持。自己恍然大悟,原来是这个原因,想要支持SNI的最低apache版本是2.2.12,所以这坚定了我升级apache和PHP版本的决心,后经本地测试的确问题可以解决,不同域名可以直接对应域名证书,不用购买通用域名证书,省下了钱(因为好多单域名证书是免费的,阿里就有),也不用难看的端口号来区分了。

如果有人看过我之前整理的贴子,通过区分端口号来绑定不同的域名使用HTTPS,那看到这篇文章,应该就不用这么操作了,但会不会有人骂我误导别人呢?总之已经有了更好的方法解决,再改一次也无妨吧!

一. 介绍

早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计,它默认认为:一台服务器(或者说一个IP)只会提供一个服务,所以在SSL握手时,服务器端可以确信客户端申请的是哪张证书。

但是让人万万没有想到的是,虚拟主机大力发展起来了,这就造成了一个IP会对应多个域名的情况。解决办法有一些,例如申请泛域名证书,对所有*.yourdomain.com的域名都可以认证,但如果你还有一个yourdomain.net的域名,那就不行了。

在HTTP协议中,请求的域名作为主机头(Host)放在HTTP Header中,所以服务器端知道应该把请求引向哪个域名,但是早期的SSL做不到这一点,因为在SSL握手的过程中,根本不会有Host的信息,所以服务器端通常返回的是配置中的第一个可用证书。因而一些较老的环境,可能会产生多域名分别配好了证书,但返回的始终是同一个。

既然问题的原因是在SSL握手时缺少主机头信息,那么补上就是了。

SNI(Server Name Indication)定义在RFC 4366,是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。

[warning]要使用SNI,需要客户端和服务器端同时满足条件,幸好对于现代浏览器来说,大部分都支持SSLv3/TLSv1,所以都可以享受SNI带来的便利。[/warning]

二. nginx / apache 服务器端实现

nginx和apache服务端支持SNI参见:

《nginx 同一个IP上配置多个HTTPS主机》

《apache mod_gnutls实现多HTTPS虚拟主机》

三. 支持SNI的浏览器、服务器、库

Internet Explorer 7 or later, on Windows Vista or higher. Does not work on Windows XP, even Internet Explorer 8.

Mozilla Firefox 2.0 or later

Opera 8.0 or later (the TLS 1.1 protocol must be enabled)

Opera Mobile at least version 10.1 beta on Android[citation needed]

Google Chrome (Vista or higher. XP on Chrome 6 or newer. OS X 10.5.7 or higher on Chrome 5.0.342.1 or newer)

Safari 2.1 or later (Mac OS X 10.5.6 or higher and Windows Vista or higher)

Konqueror/KDE 4.7 or later

MobileSafari in Apple iOS 4.0 or later

Android default browser on Honeycomb or newer

Windows Phone 7[citation needed]

MicroB on Maemo

四. 支持SNI的服务器

Apache 2.2.12 or later using mod_ssl(or alternatively with experimental mod_gnutls)

Cherokee if compiled with TLS support

Versions of lighttpd 1.4.x and 1.5.x with patch, or 1.4.24+ without patch

Nginx with an accompanying OpenSSL built with SNI support

LiteSpeed 4.1 or later

Pound 2.6 or later

Apache Tomcat on Java 7 or later

Microsoft Internet Information Server IIS 8

五. 支持SNI的库

Mozilla NSS 3.11.1 client-side only

OpenSSL

0.9.8f (released 11 Oct 2007) – not compiled in by default, can be compiled in with config option ‘–enable-tlsext’

0.9.8j (released 07 Jan 2009) through 1.0.0 (released 29 March 2010) – compiled in by default

GNU TLS

libcurl / cURL since 7.18.1 (released 30 Mar 2008) when compiled against an SSL/TLS toolkit with SNI support

Python 3.2 (ssl, urllib and httplib modules)

Qt 4.8

Oracle Java 7 JSSE

推荐的文章
# 发表我的评论
  /     /  
# 最近评论

谢谢分享

  Ads by Google
  联系博主
Hello,本博客系统采用PHP和MySql开发,程序开发完全是因为个人爱好,是自己纯手写PHP源代码,未采用任何PHP框架!
QQ:858353007   微信号:lileihot123
网站地图
会员服务
关于我们
QQ:858353007
 
广告服务
加我微信
移动端访问
 
 
Copyright © 2014- 2024 www.mdaima.com All Rights Reserved.
李雷博客,专注PHP经验、PHP教程及PHP源代码开源下载分享的PHP博客!   ICP备案号:京ICP备10202169号-4