由于全球互联网络的迅猛发展,IPv4资源逐渐成为一种稀缺资源。传统的SSL证书安装配置办法(也是目前最稳定的解决方法)就是为每个 https 主机使用不同的IP地址。
如果直接按照 http 主机的配置办法配置 https 主机,就会出现一个很普遍的问题:不论浏览器请求哪个主机,都只会收到默认主机(配置的第一个443端口的虚拟主机)的证书。这是由 SSL 协议本身的特性引起的——先建立SSL连接,再发送 https 请求(即加密主机头)。所以服务器端在与客户端建立SSL连接时不知道客户端所请求主机的名字,因此服务器端只会返回默认主机的证书。
目前已有两种可行的方案来实现多个 https 主机共享一个IP地址的443端口:
1. 使用支持多个域名的证书(多域名SSL证书 或 通配符SSL证书)
多域名SAN(SubjectAltName)证书能够在一张证书中最多支持绑定25个域名。当需要为同一台物理服务器上的多个不同域名的主机配置SSL证书时,可通配置一张共享的多域名SSL证书来实现IP地址和端口的共享。只需将所有虚拟站点的域名绑定到这张多域名SSL证书中即可。
通配符SSL证书是在一个单一的证书中,通用名(域名)字段中包含一个“*”通配符字段(*.example.com)。这使得该证书可以支持无限制数量的多个子域名(主机)。这张通配符SSL证书也可作为虚拟主机的共享证书,为所有归属于同一域名下的二级域名实现https虚拟主机的IP地址共享。
对比多域名SSL证书和通配符SSL证书的产品特征可知,多域名SSL证书受到“SubjectAltName”字段的长度限制,最多支持25个域名。而通配符SSL证书虽然支持的域名数量不受限制,但只能支持同一域名下的二级子域名。在证书的应用中需要根据证书产品特点加以合理选择。
多域名SSL证书和通配符SSL证书在配置文件中的配置:
IIS上配置https虚拟主机共享443端口,微软官方资料参考:
http://technet.microsoft.com/zh-cn/library/cc756897.aspx
cscript.exe adsutil.vbs set /w3svc/ <site identifier> /SecureBindings “:443 :<host header>”
1.先设置为Web服务器和按照一般SSL证书的要求安装成功;
2.为了安全起见,请以一般用户(Users组)登录Windows 2003 Server,运行:
runas /profile /user: MyComputer Administrator cmd
其中:MyComputer为服务器主机名,运行后会提示Administrator的密码,将以系统管理员身份运行DOS命令行。
3.在DOS命令行下运行:
cscript.exe adsutil.vbs set /w3svc/ <site identifier> /SecureBindings “:443:<host header> ”
其中: 可能需要明确指出adsutil.vbs的目录,如:C:InetpubAdminScripts,而<site identifier> 就是IIS自动分配给每个网站的网站标识符(默认站点为1,其他站点可在控制台中查询),<host header> 就是需要安装多域型SSL证书和通配型SSL证书的Web服务器域名。
4.退出DOS后,重启Web服务器后就已经生效了,可以都使用https://访问测试。
Apache配置https虚拟主机共享443端口:
Listen 443
NameVirtualHost *:443
SSLCertificateFile common.crt;
SSLCertificateKeyFile common.key;
SSLCertificateChainFile ca.crt
<VirtualHost *:443>
……
ServerName www.example1.com
……
</VirtualHost>
<VirtualHost *:443>
……
ServerName www.example2.com
……
</VirtualHost>
Nginx配置https虚拟主机共享443端口:
ssl_certificate common.crt;
ssl_certificate_key common.key;
server {
listen 443;
server_name www.example1.com;
ssl on;
…
}
server {
listen 443;
server_name www.example2.com;
ssl on;
…
}
2.开启SNI支持
SNI 是“Server Name Indication”的缩写,全称“主机名称指示”。开启SNI,可以允许一个443端口共享给多个虚拟站点,并且每一个虚拟站点都允许独立配置其唯一的证书密钥对。其优点是每个站点独享唯一密钥对,更安全。缺点是SNI受客户端及服务端程序版本限制,部分客户端及服务端程序无法支持。
TLS主机名指示扩展(SNI,RFC6066)允许浏览器和服务器进行SSL握手时,将请求的主机名传递给服务器,因此服务器可以得知需要使用哪一个证书来服务这个连接。但SNI只得到有限的浏览器和服务器支持。
SNI 客户端支持
Firefox 2.0 及后续版本
Opera 8.0及后续版本
Internet Explorer 7.0及后续版本(要求Windows最低Vista系统)
Google Chrome 所有版本(Windows版要求最低Vista系统)
Safari 3.2.1及后续版本(Mac OS版要求最低X 10.5.6 ;Windows版要求最低Vista系统)
SNI 服务器端支持
Nginx 0.5.32及后续版本
Apache 2.2.12及后续版本
IBM Http Server 7.0及后续版本
Apache 、Nginx 要求安装 Openssl0.98f(0.98j开始默认支持SNI) 或更高版本的 Openssl 支持。
SNI的配置
在Apache中配置SNI
在Apache配置文件中通过使用为不同Web Server指定不同证书文件进行配置。
Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
……
ServerName www.example1.com
SSLCertificateFile www.example1.com.crt
SSLCertificateKeyFile www.example1.com.key
SSLCertificateChainFile ca.crt
……
</VirtualHost>
<VirtualHost *:443>
……
ServerName www.example2.com
SSLCertificateFile www.example2.com.crt
SSLCertificateKeyFile www.example2.com.key
……
</VirtualHost>
开启虚拟主机配置
在Nginx中配置SNI
Nginx 中通过 nginx -v 命令查询当前已安装的版本对 SNI 功能的支持。在配置文件中通过
server {
listen 443;
server_name www.example1.com;
ssl on;
ssl_certificate server1.crt;
ssl_certificate_key server1.key;
…
}
server {
listen 443;
server_name www.example2.com;
ssl on;
ssl_certificate server2.crt;
ssl_certificate_key server2.key;
…
}
开启SNI支持。
在IBM Http Server 7中配置SNI
IBM Http Server 7中配置SNI支持需要将多个证书密钥对合并到一个单独的kdb文件中来为不同虚拟站点配置使用不同证书。
使用 I Key Manager 工具打开 www.example1.com 的服务器证书 key.kdb 文件,切换到“个人证书”选项卡,选择“导入/导出”。然后选择证书导入密钥库,密钥库格式选择“CMS”格式,并选中 www.example2.com 的服务器证书 key.kdb 文件。将 www.example2.com 的服务器证书 key.kdb 中已存在的证书密钥对导入到 www.example1.com 的 key.kdb 文件中。导入过程中,修改导入的密钥对别名为 example2。
Listen *:443
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.example1.com
SSLEnable
SSLServerCert example1 # example1 是在 kdb 文件中,为 www. example1.com 的服务器证书密钥对设置的证书别名
</VirtualHost>
<VirtualHost *:443>
ServerName www.example2.com
SSLEnable
SSLServerCert example2 # example2 是在 kdb 文件中,为 www. Example2.com 的服务器证书密钥对设置的证书别名
</VirtualHost>
SSLDisable
KeyFile /opt/IBM/HTTPServer/key.kdb