一、介绍

早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计,它默认认为:一台服务器(或者说一个IP)只会提供一个服务,所以在SSL握手时,服务器端可以确信客户端申请的是哪张证书。

但是让人万万没有想到的是,虚拟主机大力发展起来了,这就造成了一个IP会对应多个域名的情况。解决办法有一些,例如申请泛域名证书,对所有*.yourdomain.com的域名都可以认证,但如果你还有一个yourdomain.net的域名,那就不行了。

在HTTP协议中,请求的域名作为主机头(Host)放在HTTP Header中,所以服务器端知道应该把请求引向哪个域名,但是早期的SSL做不到这一点,因为在SSL握手的过程中,根本不会有Host的信息,所以服务器端通常返回的是配置中的第一个可用证书。因而一些较老的环境,可能会产生多域名分别配好了证书,但返回的始终是同一个。

既然问题的原因是在SSL握手时缺少主机头信息,那么补上就是了。

SNI(Server Name Indication)定义在RFC 4366,是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。

要使用SNI,需要客户端和服务器端同时满足条件,幸好对于现代浏览器来说,大部分都支持SSLv3/TLSv1,所以都可以享受SNI带来的便利。

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

server {listen          443;server_name     www.example.com;ssl             on;ssl_certificate www.example.com.crt;...}server {listen          443;server_name     www.example.org;ssl             on;ssl_certificate www.example.org.crt;...
}

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


server {listen          192.168.1.1:443;server_name     www.example.com;ssl             on;ssl_certificate www.example.com.crt;...}server {listen          192.168.1.2:443;server_name     www.example.org;ssl             on;ssl_certificate www.example.org.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.yk.com;index index.html index.htm index.php;root  /data/wwwroot/www.ttlsa.com/webroot;ssl on;ssl_certificate "/usr/local/nginx/conf/ssl/www.ttlsa.com.public.cer";ssl_certificate_key "/usr/local/nginx/conf/ssl/www.ttlsa.com.private.key";  ......}server  {listen 443;server_name   www.myweb.com;index index.html index.htm index.php;root  /data/wwwroot/www.heytool.com/webroot;ssl on;ssl_certificate "/usr/local/nginx/conf/ssl/www.heytool.com.public.cer";ssl_certificate_key "/usr/local/nginx/conf/ssl/www.heytool.com.private.key";  ......
}

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

HTTPS之SNI介绍与Nginx多域名支持相关推荐

  1. WebSocket 结合 Nginx 实现域名及 WSS 协议访问

    简单了解一下 WebSocket 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器 ...

  2. nginx 配置域名 http https 80+443端口

    安装nginx apt-get install -y nginx 如果希望直接使用ip访问(即直接使用80端口),需要删除默认文件.不使用80端口.有域名.使用https等其他方式则跳过此步(不用删除 ...

  3. 【服务器】nginx二级域名配置

    关于Nginx二级域名的配置,网上有好多文章和教程(好多都一样的),然而发现有太多复制粘贴且不适用的,这里安利一个炒鸡简单的方式配置nginx二级域名的方法. 首先介绍使用到的服务器的环境LNMP环境 ...

  4. 配置 Nginx 和 frps 共存 80/443 端口及泛域名支持教程

    本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.配置 Nginx 和 frps 共存 80/443 端口及泛域名支持教程 - 思有云 - IOIOX ...

  5. nginx配置域名转发、反向代理、负载均衡

    [Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...

  6. nginx配置域名启用http2协议

    HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议.HTTP/2在支持HTTP1.1的基础上拓展了, 较之1.1在性能上有着大 ...

  7. Nginx多域名多Server反向代理配置

    Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了. 下面我就来说说server_name的使用吧: s ...

  8. nginx多域名设置和多子目录实现共用一端口

    nginx多域名设置,多子目录,共用一端口 nginx多域名设置,多子目录,公用一端口 前段时间自己买了一个80G的服务器,所以想把原来的网站都整合到这台服务器上面,现在在服务器上绑定了五个域名. 下 ...

  9. Nginx二级域名及多Server反向代理配置

    Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了. 注:nginx反向代理同一ip多个域名,给head ...

  10. 阿里云 网站https设置 sll申请与nginx跳转配置

    网站https设置 sll申请与nginx跳转配置 这里选择1年 点击证书申请 这里注意要写文件验证 文件验证 上传文件到服务器指定目录,DNS解析到后访问该文件完成验证 手工DNS验证 改域名的DN ...

最新文章

  1. html代码格式化vscode,vscode 代码格式化
  2. 58同城沈剑:好的架构源于不停地衍变,而非设计
  3. mongoDB - 日常操作四
  4. zabbix snmp 协议监控 dell iRDAC
  5. load和pageshow的区别
  6. python 示例_带有示例的Python date timetuple()方法
  7. mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
  8. PostgreSQL如何使用PLJava支持Java编程
  9. 2091: [Poi2010]The Minima Game
  10. 蓝桥杯 ADV-126 算法提高 扫雷
  11. 字节实习生开发的 AI 竟然被网友用在了王冰冰身上!
  12. LeetCode() Search in Rotated Sorted Array
  13. WS2811 M是三通道LED驱动控制专用电路彩灯带方案开发
  14. 关于曼哈顿距离的最小生成树 POJ3241
  15. WMware安装win10
  16. android4.4系统 分屏,基于Android系统的宽屏后视镜分屏方法及系统与流程
  17. cordova 调起拨打电话
  18. pr使用视频素材技巧
  19. input框点击时去掉默认的外层边框
  20. Python:实现scoring functions评分函数算法(附完整源码)

热门文章

  1. 风控ML[15] | 风控模型报告以及上线后需要监控的内容
  2. win10计算机全名恢复,详细教您win10强制进入恢复模式方法
  3. python编程求长方形的面积_python实现用类读取文件数据并计算矩形面积
  4. 联盛德 HLK-W806 (三): 免按键自动下载和复位
  5. 【SPEA飞针测试】4085飞针测试机简述
  6. Fiddler:显示请求花费的时间
  7. php源码比赛,TSRC挑战赛: PHP防御绕过挑战实录
  8. ArduinoProteus 8 Professional——(超声波检测传感器SRF04(距离检测))for Neuedu
  9. PyMOL | Pymol绘图教程(一)
  10. linux 中移动文件_如何在Linux中移动文件