nginx-host绕过实例复现中SNI绕过

介绍

    早期的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带来的便利。

 配置环境

我们就需要准备两套完整的nginx解析https虚拟主机进行测试。以及个服务器证书与私钥(因为我以前就配置过了一次,所以只需要配置一个证书)

[root@localhost ~]# cd /etc/key
[root@localhost key]# ls
ssla.crs  ssla.crt  ssla.key
[root@localhost key]# openssl  genrsa -des3 -out sslb.key 4096
[root@localhost key]# mv sslb.key xk.key
[root@localhost key]# openssl rsa -in xk.key -out sslb.key
[root@localhost key]# rm xk.key 
[root@localhost key]# openssl req -new -key sslb.key -out sslb.crs
[root@localhost key]# openssl x509 -req -days 365 -in sslb.crs -signkey sslb.key -out sslb.crt
[root@localhost key]# ls
sslb.crs  sslb.crt  sslb.key  ssla.crs  ssla.crt  ssla.key

网页配置

[root@localhost ~]# cd /var/www/
[root@localhost www]# mkdir aaa
[root@localhost www]# mkdir bbb
[root@localhost www]# echo 'this is a' > /var/www/aaa/index.html
[root@localhost www]# echo 'this is b' > /var/www/bbb/index.html

修改本机host下文件

192.168.150.133 www.aaa.com 
192.168.150.133 www.bbb.com

实验

单主机生效

    server {
        listen       443 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }

   

双方使用同一个证书

server {
        listen       443 ssl;
        server_name  www.aaa.com;

         ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }

    server {
        listen       443 ssl;
        server_name  www.bbb.com;

         ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }

 双方使用不同证书

server {
        listen       443 ssl;
        server_name  www.aaa.com;

         ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }
    
server {
        listen       443 ssl;
        server_name  www.bbb.com;

         ssl_certificate      /etc/key/sslb.crt;
        ssl_certificate_key  /etc/key/sslb.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }
    }

端口号区分,证书区分

server {
        listen       8443 ssl;
        server_name  www.bbb.com;

         ssl_certificate      /etc/key/sslb.crt;
        ssl_certificate_key  /etc/key/sslb.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }
  server {
        listen       8444 ssl;
        server_name  www.aaa.com;

         ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }

端口号区分,证书不区分

server {
        listen       8443 ssl;
        server_name  www.bbb.com;

         ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }
  server {
        listen       8444 ssl;
        server_name  www.aaa.com;

         ssl_certificate      /etc/key/ssla.crt;
        ssl_certificate_key  /etc/key/ssla.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值