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
#默认SSLCertificateChainFile会被注释,请删除行首的“#”号注释符,并将CA证书ca.crt配置到该路径下
<Directory /path/to/ssl/enabled/site/>
SSLRequireSSL
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName www.test2.com
SSLOptions StrictRequire
DocumentRoot /path/to/other/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
#默认SSLCertificateChainFile会被注释,请删除行首的“#”号注释符,并将CA证书ca.crt配置到该路径下
<Directory /path/to/other/ssl/enabled/site/>
SSLRequireSSL
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>
最后,保存 httpd-vhost.conf 文件并退出,使用https方式访问网站,测试证书配置是否成功。