我们的服务遍布中国

我们的服务遍布中国
乃至世界

光网所服务的品牌地域与城市
北京 天津 上海 广州 深圳 香港 厦门 江苏 浙江 山东
重庆 长沙 武汉 成都 西安 宁夏 丽江 青海 云南 乌鲁木齐
黑龙江 内蒙古 河北 ...
光网服务与合作的全球各地
美国 加拿大 德国 法国 英国 瑞士 意大利 荷兰
印度 日本 韩国 ...

不论你的品牌在何处
我们都可以提供完善的服务与帮助

致电

0512-56969630
您所在的位置:首页 > SSL证书

nginx 同一个IP上配置多个HTTPS主机

发布时间:2017/2/18 10:19:51 浏览:87打印字号:

最近公司域名更变,同时,又要新旧域名同时运行。 那么,对于https的域名在同一个IP上如何同时存在多个虚拟主机呢?遂,查看了下nginx手册,有这么一段内容,如下: 如果在同一个IP上配置多个HTTPS主机,会出现一个很普遍的问题:

server {
    listen          443;
    server_name     www.gworg.cn;
    ssl             on;
    ssl_certificate www.gworg.cn;
    ...
}
 
server {
    listen          443;
    server_name     www.gworg.com;
    ssl             on;
    ssl_certificate www.gworg.com.crt;
    ...
}

使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机www.example.com的证书。这是由SSL协议本身的行为引起的——先建立SSL连接,再发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。 最古老的也是最稳定的解决方法就是每个HTTPS主机使用不同的IP地址:

server {
    listen          192.168.1.1:443;
    server_name     www.gworg.com;
    ssl             on;
    ssl_certificate www.gworg.com.crt;
    ...
}
 
server {
    listen          192.168.1.2:443;
    server_name     www.gworg.cn;
    ssl             on;
    ssl_certificate www.gworg.cn.crt;
    ...
}

那么,在同一个IP上,如何配置多个HTTPS主机呢? nginx支持TLS协议的SNI扩展(Server Name Indication,简单地说这个扩展使得在同一个IP上可以以不同的证书serv不同的域名)。不过,SNI扩展还必须有客户端的支持,另外本地的OpenSSL必须支持它。 如果启用了SSL支持,nginx便会自动识别OpenSSL并启用SNI。是否启用SNI支持,是在编译时由当时的 ssl.h 决定的(SSL_CTRL_SET_TLSEXT_HOSTNAME),如果编译时使用的OpenSSL库支持SNI,则目标系统的OpenSSL库只要支持它就可以正常使用SNI了。 nginx在默认情况下是TLS SNI support disabled。 启用方法: 需要重新编译nginx并启用TLS。步骤如下:

# wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
# tar zxvf openssl-1.0.1e.tar.gz 
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module \
--with-openssl=./openssl-1.0.1e \
--with-openssl-opt="enable-tlsext" 
# make
# make install

查看是否启用:

# /usr/local/nginx/sbin/nginx -V
TLS SNI support enabled

这样就可以在 同一个IP上配置多个HTTPS主机了。 实例如下:

server  {
        listen 443;
        server_name   www.gworg.com;
        index index.html index.htm index.php;
        root  /data/wwwroot/www.gworg.com/webroot;
        ssl on;
        ssl_certificate "/usr/local/nginx/conf/ssl/www.gworg.com.public.cer";
        ssl_certificate_key "/usr/local/nginx/conf/ssl/www.gworg.com.private.key";   
 ......
} 
 
server  {
        listen 443;
        server_name   www.gworg.n;
        index index.html index.htm index.php;
        root  /data/wwwroot/www.gworg.n/webroot;
        ssl on;
        ssl_certificate "/usr/local/nginx/conf/ssl/www.gworg.cn.public.cer";
        ssl_certificate_key "/usr/local/nginx/conf/ssl/www.gworg.cn.private.key";   
 ......
}

这样访问每个虚拟主机都正常。