由于全球互联网络的迅猛发展,IPv4资源逐渐成为一种稀缺资源。传统的SSL证书安装配置办法(也是目前最稳定的解决方法)就是为每个 https 主机使用不同的IP地址。
如果直接按照http主机的配置办法配置 https 主机,就会出现一个很普遍的问题:不论浏览器请求哪个主机,都只会收到默认主机(配置的第一个443端口的虚拟主机)的证书。这是由SSL协议本身的特性引起的——先建立SSL连接,再发送 https 请求(即加密主机头)。所以服务器端在与客户端建立SSL连接时不知道客户端所请求主机的名字,因此服务器端只会返回默认主机的证书。
目前已有两种可行的方案来实现多个 https 主机共享一个IP地址的443端口:
1. 使用支持多个域名的证书(多域名SSL证书 或 通配符SSL证书)
多域名SAN(SubjectAltName)证书能够在一张证书中最多支持绑定25个域名。当需要为同一台物理服务器上的多个不同域名的主机配置SSL证书时,可通配置一张共享的多域名证书来实现IP地址和端口的共享。只需将所有虚拟站点的域名绑定到这张多域名SSL证书中即可。
可接受的域名格式
|
示例
|
国际顶级域名
|
www.domain.com、www.domain.net
|
|
|
|
|
CN顶级域名
|
www.domain.cn、www.domain.com.cn
|
其他顶级域名
|
www.seconddomain.com
|
|
|
|
|
子域名
|
server.domain.com、server.cn.domain.com…
|
|
|
|
|
服务器主机名
|
msexchange1
|
Intranet名称和内网域名
|
msautodiscovery、sercer.local
|
RFC 1597所规定的私有IP地址
|
192.168.0.0 – 192.168.255.255
10.0.0.0 – 10.255.255.255
|
至多一个公网IP地址
|
202.*.*.* …
|
通配符SSL证书是在一个单一的证书中,通用名(域名)字段中包含一个“*”通配符字段(*.example.com)。这使得该证书可以支持无限制数量的多个子域名(主机)。这张通配符证书也可作为虚拟主机的共享证书,为所有归属于同一域名下的二级域名实现https虚拟主机的IP地址共享。
对比多域名证书和通配符证书的产品特征可知,多域名证书受到“SubjectAltName”字段的长度限制,最多支持25个域名。而通配符证书虽然支持的域名数量不受限制,但只能支持同一域名下的二级子域名。在证书的应用中需要根据证书产品特点加以合理选择。
2.开启SNI支持
SNI 是“Server Name Indication”的缩写,全称“主机名称指示”。
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配置文件中通过使用
Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
……
ServerName www.example1.com
……
</VirtualHost>
<VirtualHost *:443>
……
ServerName www.example2.com
……
</VirtualHost>
开启虚拟主机配置
在Nginx中配置SNI
Nginx 中通过 nginx -v 命令查询当前已安装的版本对 SNI 功能的支持。在配置文件中通过
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;
…
}
开启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