分类
知识中心

Apache单IP配置多个HTTPS虚拟主机方案

在Apache文档中提到,不能在单个IP上同时有多个按名字识别的虚拟主机(“named virtual host”),其实不完全是这样,接下来我们就来演示下如何打破这一魔咒。

  使用SNI

SNI全称Server Name Indication(服务器名称指示),这个问题可以解决apache中的单IP多HTTPS虚拟主机,只有默认第一个站点的SSL生效的问题。但是这些技术需要浏览器的版本支持

  支持SNI的浏览器

*Mozilla Firefox 2.0 or later

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

*Internet Explorer 7(Vista,not XP)or later

*Google Chrome(Vista,not XP)(NOT Chromium)

*Safari 3.2.1 Mac OS X 10.5.6

  支持SNI的web容器

*apache版本在2.2.12以上

*需要mod_gnutls或者mod_ssl模块的支持

*Openssl在0.9.8j后的版本也都支持了SNI的功能

  配置Apache

打开Apache/conf/extra/httpd-vhost.conf文件并找到以下参数进行配置。

Listen 443

NameVirtualHost*:443

<VirtualHost*:443>

ServerName www.test1.com

SSLOptions StrictRequire

DocumentRoot/path/to/ssl/enabled/site

SSLProtocol all-SSLv2-SSLv3

注意,这里我们同时禁用了SSLv2、SSLv3不安全的协议。

SSLHonorCipherOrder on

SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM

SSLCertificateFile conf/server.crt

SSLCertificateKeyFile conf/server.key

SSLCertificateChainFile conf/ca.crt

完成上述操作后,将CA证书ca.crt配置到该路径下。

<Directory/path/to/ssl/enabled/site/>

SSLRequireSSL

Order Deny,Allow

Allow from All

</Directory>

</VirtualHost>

“`

最后,保存httpd-vhost.conf文件并退出,使用https方式访问网站,测试证书配置是否成功。

分类
知识中心

如何应用单个IP地址共享443端口配置多个SSL虚拟主机

由于全球互联网络的迅猛发展,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