SSL v2的设计顺应经典的公钥基础设施PKI(public key infrastructure)设计,后者认为一个服务器只提供一个服务从而也就只使用一个证书。这意味着服务器可以在TLS启动的早期阶段发送或提交证书,因为它知道它在为哪个域服务。HTTP服务器开启虚拟主机支持后,每个服务器通过相同的地址可以为很多域提供服务。服务器检查每一个请求来决定它在为哪个域服务。这个信息通常从HTTP请求头获得。不幸的是,当设置了TLS加密,服务器在读取HTTP请求里面的域名之前已经向客户端提交了证书,也就是已经为默认域提供了服务。因此,这种为虚拟主机提供安全的简单途径经常导致使用了错误的数字证书,从而导致浏览器对用户发出警告。
以上描述摘自OpenWares。详细了解请到:服务器名字指示SNI(Server Name Indication)
即访问www.buyberry.net会读取到beta.buyberry.net的证书,这样浏览器会报证书错误。
因此需要Server Name Indication (RFC 4366)这个扩展协议来修正。标准apache是支持Name Based SSL VHosts With SNI 。前提需要 OpenSSL 0.9.8f 之后才能支持。但是IHS并不支持这个扩展协议。
只能使用基于端口或者基于IP的虚拟主机来workaround
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
Listen 443
Listen 444
NameVirtualHost www.buyberry.net:443
ServerName www.buyberry.net
SSLCipherSpec 34
SSLCipherSpec 35
SSLCipherSpec 3A
SSLCipherSpec 33
SSLCipherSpec 36
SSLCipherSpec 39
SSLCipherSpec 32
SSLCipherSpec 31
SSLCipherSpec 30
DocumentRoot “/ihs/htdocs”
SSLEnable
SSLClientAuth none
Keyfile “/ihs/sslkey20121227/key.kdb”
ErrorLog logs/ssl1_error_log
CustomLog logs/ssl1_access_log common env=!image
NameVirtualHost beta.buyberry.net:444
ServerName beta.buyberry.net
SSLCipherSpec 34
SSLCipherSpec 35
SSLCipherSpec 3A
SSLCipherSpec 33
SSLCipherSpec 36
SSLCipherSpec 39
SSLCipherSpec 32
SSLCipherSpec 31
SSLCipherSpec 30
DocumentRoot “/ihs/htdocs”
SSLEnable
SSLClientAuth none
Keyfile “/ihs/2012key/2012key.kdb”
ErrorLog logs/ssl2_error_log
CustomLog logs/ssl2_access_log common env=!image