微信号:gh_c699791d0cc9

介绍:HULK是360的私有云平台,丰富的一线实战经验,为你带来最有料的技术分享

正规的足疗店(HTTPS服务)需要注意的几个细节

2016-08-16 18:11 田振


“大哥!我们店的服务项目都有:空中飞人、水晶之恋….”

啪啪啪!(拍肩膀的声音),你们都想哪去了!? 我们可是严格遵守法律的正规足疗店!当然市场上也有很多非法不正规的,可是为了保护您的合法权益,避免上当受骗,所以还是请到有正规营业执照的门店去消费!


言归正传,让我们回到正常的思维上来说说这个事

Begin


在开通正规足疗店(上线HTTPS)的过程中,需要注意哪些细节呢?



一言不合就爆图



  

为什么我们要7层代理呢?其实最根本的原因还是为了解决用户跨运营商访问特别慢的问题,因为公司内部的核心IDC之间都是千兆/万兆光纤互联的,近乎于局域网的延迟。

打个比方:移动地区的用户访问联通线路的服务特别的慢,并且移动运营商的劫持特别严重,为了解决这个问题最简单的办法就是在移动机房部署7层代理,利用移动机房和联通机房光纤互联的特性提升用户体验。


可是在给七层代理上的Nginx部署HTTPS服务时,我们发现了一些隐蔽性比较强的坑


总结一下这些踩坑过程的:

  • 同一个IP和端口在某些Nginx版本下,不能同时绑定多个证书。

  • 绑定多个证书后,如果多个vhost配置文件或主配置文件中的SSL配置不一致会导致SSL验证间断性失败。



OK,让我们按照顺序从第一个问题说起




1
相同IP+端口绑定多证书



如果你的nginx包含如图中所示“TLS SNI support enabled”的状态,那么就不会存在这个问题。

可是满足Nginx的SNI 协议开启的条件是什么呢?请往下接着看:

  1. 系统中openssl的版本确保在0.9.8j以上。

  2. Nginx的版本确保在0.5.32.以上。

  3. Nginx编译参数要加上

    --with-http_ssl_module

      --with-openssl=openssl-1.0.1j

    表明nginx开启ssl模块、加载上系统中符合要求的openssl版本

扫盲贴

说了半天到底什么才是SNI协议啊?

什么才是证书啊?

SNI协议简单的说就是:可以支持同一个IP+端口绑定多个证书的协议。同时就可以在相同的IP+端口上为多个域名做HTTPS服务了。


那证书又是什么鬼啊


简单的说证书就是:标识互联网中web站点身份的唯一凭证。


再回到足疗店的话题上加深一下理解吧...

比如你想在某某核心商业区开一家足疗店(上线HTTPS),但是你没有国家颁发的许可证和营业执照(CA认证机构颁发的证书),那么你就是不合法(不安全)的。但我们必须对消费者的安全负责,所以在开足疗店(上线HTTPS)前,需要向工商局和相关部门(CA证书的代理机构)申请营业执照(证书),这样才能开正规的足疗店。 

2
多个vhost中的ssl配置不一致


这个配置不一致的坑会避开“-t”的语法检测,非常的隐蔽。


举例说明一下:

下面的是nginx.conf主配置文件中SSL相关的配置:

ssl on;

ssl_session_cache  shared:SSL:50m;           #50M 

ssl_session_timeout  300;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers  on;

ssl_certificate /usr/local/nginx/ssl/xxx.pm;

ssl_certificate_key /usr/local/nginx/ssl/xxx.key;


下面的是某个vhost.conf配置文件中SSL的配置:

ssl on;

ssl_session_cache  shared:SSL:30m;           #30M

ssl_session_timeout  300;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers  on;

ssl_certificate /usr/local/nginx/ssl/xxx.pm;

ssl_certificate_key /usr/local/nginx/ssl/xxx.key;


有没有看到哪里不对?对!就是缓存cache的大小不一样,一个是50M、一个是30M。这点小小的不同并不会导致nginx的语法错误,可是结果却会造成用户请求出现不间断的SSL验证失败。

所以:Nginx配置文件中ssl相关的配置必须全局一致!



为什么配置不一致就会这样子啊?


因为当Nginx拆封接收到的数据包时,SSL包是先于HTTP包进行拆封的,而拆封的时候Nginx并不知道这个SSL包拆封是为哪个vhost做的,只有当拆封到HTTP包头时才知道是为哪个vhost做的。


再次回到足疗店的话题上吧...

比如你去足疗店做按摩(请求HTTPS服务),你约了冰冰技师(bingbing.com对应的vhost)给你做,但是进入足疗店的时候你需要先进行安检(SSL验证)才能进去,可是保安大哥(openssl)并不知道你约了哪个技师,安检结束后(SSL验证结束)你需要和前台(nginx进程)确认才能找到冰冰技师。因此如果安检员有精神分裂症(SSL配置不一致)的话,他会时不时的把你拒之门外。



这里再说一个细节:

在代理的机器上完成SSL验证后,proxy_pass的时候只需通过HTTP 80端口转发到后端即可,这样可以减少一次后端的SSL验证过程,提升效率。

光说没用,上配置上配置~




upstream hulk

{

server x.x.x.1 weight=10;               

server x.x.x.2 weight=10;               

}


server {

    listen 80;

    listen 443;

    server_name hulk.com;


    location ~ /

    {

    proxy_set_header Host $http_host;

    proxy_set_header X-Forwarded-For  $remote_addr;

    proxy_pass http://hulk;           # 注意这里proxy_pass的时候直接通过HTTP协议转发

    }


    ssl on;

    ssl_session_cache  shared:SSL:50m;

    ssl_session_timeout  300;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers HIGH:!aNULL:!MD5;

    ssl_prefer_server_ciphers  on;

    ssl_certificate /usr/local/nginx/ssl/xxx.pm;

    ssl_certificate_key /usr/local/nginx/ssl/xxx.key;

}



希望通过这次足疗店的体验能避免小伙伴们吃亏
End



 
HULK一线技术杂谈 更多文章 你还没女朋友,只能怪你不懂TCP 中秋没有月饼有技术也有真爱! 一招学会压测 你不知道的十大职场“潜规则" 互联网时代必备的"撩妹"技能,不会你就OUT啦
猜您喜欢 企业级大数据知识图谱产品构建与应用 【福利】精选 Leanpub 免费电子书 那些年我们用过的显示性能指标 第二季《科技喵喵喵》屌屌地来辣! Kafka设计解析(五)- Kafka Consumer设计解析