当一个HTTPS请求到达Web服务器时,该HTTPS请求为加密状态,需要相应的服务器证书解密该HTTPS请求。由于每个站点对应的证书不同,因此服务器需要通过请求中的主机头来选择用来解密的证书。但是主机头作为请求的一部分信息,也被作为加密对象,因此Web服务器选择第一个绑定到指定IP地址和端口的站点,使用该站点证书进行解密,导致Web服务器对其他站点请求解密失败从而发生报错。
本文提供了三种Web服务器的解决方案,以下是详细内容。
您可以在IIS服务器中选择以下四种方法解决问题:
绑定到多端口
将每个HTTPS站点绑定到同一IP地址的不同端口。例如,将HTTPS站点绑定到
[$Domain]:[$Port]
,但是从客户端浏览网页时必须在地址栏中手动指定端口。
[$Domain]
:站点域名。
[$Port]
:指定端口。
各站点采用通配证书,例如
example.aliyundoc.com
、
demo.aliyundoc.com
和
learn.aliyundoc.com
三个站点可以选择颁发给
.aliyundoc.com
的证书,此时任何访问各站点的请求都可以通过该证书解密。
升级IIS
将IIS版本升级到IIS8,IIS8中支持SNI(Server Name Indication)功能,服务器可以从请求中提取出相应的主机头从而获取相应的证书。关于SNI的开启方式,请参见
SSL Scalability
。
在Nginx服务器中,可通过增加一个虚拟主机的方式,完成多站点绑定到服务器同一个IP地址和同一个端口,请参考以下操作方法:
登录Nginx服务器,执行以下命令,打开Nginx配置文件。
vim [$Nginx_Dir]/conf/nginx.conf
说明
[$Nginx_Dir]
为Nginx的安装目录,默认为
/usr/local/nginx
。
参考以下配置,编辑配置文件。
server {
listen 443;
server_name [$Domain1];
ssl on;
ssl_certificate [$Certificate_Path1];
ssl_certificate_key [$Key_Path1];
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers [$Ciphers_Suite1];
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}server {
listen 443;
server_name [$Domain2];
ssl on;
ssl_certificate [$Certificate_Path2];
ssl_certificate_key [$Key_Path2];
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers [$Ciphers_Suite2];
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
Apache
登录Apache服务器,执行以下命令,打开ssl.conf配置文件。vim [$Apache_Dir]/conf.d/ssl.conf
[$Apache_Dir]为Apache的安装目录,默认为/etc/httpd。
若没有找到ssl.conf配置文件,则请执行yum install mod_ssl -y
命令,下载SSL相关模块。
Apache开启SNI后,需增加SSLStrictSNIVHostCheck off参数。
ServerName [$Domain1]
SSLCertificateFile [$Certificate_Path1];
SSLCertificateKeyFile [$Key_Path1];
SSLCertificateChainFile [$Certificate_Chain1];
</VirtualHost>
<VirtualHost *:443>
ServerName [$Domain1]
SSLCertificateFile [$Certificate_Path2];
SSLCertificateKeyFile [$Key_Path2];
SSLCertificateChainFile [$Certificate_Chain2];
如果是一个证书包含
www.example.com
和
example.com
的情况(例如阿里云的免费证书),建议写成以下格式,否则可能导致带www的域名无法连接。
ServerName example.com
ServerAlias www.example.com
[$Certificate_Chain1]:第一个站点的中级证书捆绑包路径。
[$Certificate_Chain2]:第二个站点的中级证书捆绑包路径。
在Apache V2.4.8及更高版本中,SSLCertificateChainFile的配置信息已被SSLCACertificatePath的配置信息替换。