https的理解并结合nginx实际部署

Owen Jia 2019年09月21日 1,847次浏览

1.学习缘由
平时喜欢看资讯,偶然看到了几篇介绍https使用的,不少公司都在向它迁移,百度、google等大公司都转换了它;抱着学习的心态,在公司内提出把项目转换到https上,结合nginx(早前我搭的),最终https配置让其他同事给做了(呵呵,完全没我事,好遗憾);但是我还是想搞明白它是怎么玩的,问了度娘自己再勤奋点就基本明白个大致,写这个这里希望能分享下,顺便整理整理思路;

2.浏览器访问原理,结合我们实际环境部署情况

这个图片从一篇文章摘录,具体也不记得了,做的不错;

2.1 client访问url,一种是https://www.domain.com/...访问直接走443端口到server;另一种是http://www.domain.com/....访问走80端口到server被nginx的rewrite成https://www.domain.com/...重新走443到server;server部署了nginx监听了80和443端口,80的全部重新转换到443,这一步多了个重定向;

2.2
server 443端口通过nginx中把crt public key发送个client端;crt申请了“沃通”的,它们会提供public和private两种key,具体细节我也不清楚,没申请过应该也简单(呵呵了);client会去验证crt的合法性,然后就是yes or no? no的做法有的弹个提示,有的给你直接拒绝访问;yes 的话,浏览器会根据规则(后面说这个规则是啥)生成random key(简单说是密钥);

2.3
clinet会用前面server返回的crt-public(公钥,,ssl套餐中涉及crt中的非对称加密,密钥有私钥和公钥两种)去加密这个random key(每次session生成都不同),发送给server;其中就在这步相比较来说client会消耗computer(要看你电脑配置了,个人觉得现在大多数电脑估计也看不出来,呵呵了),要check crt 又要generate key;

2.4
server收到client发来的data会用自己的 crt-private-key 去解密它,顺便验证这个key是否完整(md5等hash),yes or no?,以上都ok了,那么ssl协议成功的使访问握手,后面就不在走图上1-6步了;

2.5
接着上面用random-key去加密数据(这里开始通信content用的是对称加密),response给client;

2.6
client收到response用之前自己生成的random-key去解密content,从而获取content明文的;后面的request-response都用这个key去加密和解密数据;

,分享下我们自己部署的nginx-80端口,原创图哦!

,nginx-crt-443端口配置,原创图哦!

3.https中使用技术和细节

在1-5的步骤中还有个问题就是他们用的加密算法是怎么确定的,毕竟一个是client一个server,谁都不知道谁?何况有那么各式各样的browser,做web 程序猿的就是痛苦;

因为 ... 所以 ... ok;

浏览器的第1步请求(这里说的1就是第一图request-response交互图,后续也是如此),client不单就是一个简单的request,还把自己的支持的tls(ssl后面改名叫这个,它的版本进化:ssl3.0->tls1.0->tls1.1->tls1.2->...,它是个大家都遵守的协议),包括有:对称算法列表(验证后来加密content),如**DES 56/56, RC2 56/128, RC4 128/128, AES 128/128, AES 256/256等、hash算法列表(验证数据完整性),如MD5,SHA等、随机数生成算法列表(生成随机数key,后面content的密钥),如PRF等**、非对称加密算法列表(用来加密random-key),如**RSA,Diffie-Hellman,ECDH,PSK等**、client hello(就是一个一句hello)和其他一些信息等;

第2步中,server拿到这个tls时会与自己支持的tls比较并取max(大家都能支持的最大版本),第3步就是返回给client信息:自己的crt信息(public-key|version等)、选择的tls版本、server hello(就是一句回应,总要有个反馈是吧);

第4步中,client收到server hello后,首先拿crt信息去这个crt注册商那里验证合法性(有的会验证crt里面的域名等) ,no?你懂的,yes,就查看选择的tls版本套餐,然后用这个套餐中的随机数算法生成random key并用server给crt-public-key加密它并hash下发送给server,这样第5步也走完了;第6步server收到信息后用只有自己知道的crt-private-key去解密这个random-key并hash下,这时相互加密的key(密钥)就都有了,tls的核心就是保证这个key不被第三方截获,以保证后续请求数据的安全;第7步就简单了用对称算法(tls套餐中的)、hash算法和密钥key去加密content,client使用相同算法和密钥key验证、解密就好了;

**这是一个****cipher ****: **TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,自己去研究吧!!!!!!

** 4.https个人理解**
http->https,主要因为http的数据是明文而且可被拦截并串改(网络发展嘛,一步步完善的),而现在的人对网络安全要求越来越高,这个不安全的却广为使用的协议肯定要被淘汰的;至于https中的s早在上个世纪90年底就被提出了,具体历史可以自己问度娘;很多人担心https的性能会拖慢访问速度降低用户体验,其实这个真的可以忽略的,想想个人电脑20年前是什么样子的,你就明白什么叫做长江后浪推前浪,历史的潮流是不会后退的,再不积极你就out了,亲;

-----有错误的地方,请大家指正....