谈谈我认识的HTTPS

本文将通俗易懂地介绍HTTPS的通信过程和工作原理

Posted by lijiahao on September 30, 2017

如今网络安全性越来越受到重视,普通的HTTP传输已经不能满足严格的信息安全需求,越来越多的用户选择使用HTTPS,那么HTTPS是什么?HTTPS为什么比HTTP安全?HTTPS传输的过程发生了什么?本文将从个人的理解角度努力去给予解答。

HTTP和HTTPS

HTTP是作为OSI应用层中的协议,当传输信息时,是明文传输的,那么就很容易发生安全问题,任何第三方介入发送端和接收端(俗称中间攻击人)就可以知道传输的内容,从而造成信息泄露问题。在这种情况下就诞生了HTTPS,HTTPS并不是一个全新的协议,而是HTTP+SSL/STL。SSL全称Secure Sockets Layer,他是网景公司发明的用来解决HTTP协议使用明文传输信息造成的信息安全泄露问题而发明出来的协议,后来SSL得到广泛使用,成了互联网的一个标准,后改名为TLS(Transport Layer Security),中文名叫做:“传输层安全协议”。

SSL/TSL位于HTTP和TCP之间,HTTP需要传输的信息通过SSL/STL加密后,再传输到TCP进行传输,接收到的信息也是先经过SSL/STL解密再回到HTTP,如此一来使用HTTPS传递信息就不再是明文传输了。

一些基本概念

在讨论HTTPS如何加密传输之前,我们需要先做一些功课来了解相关概念。涉及到HTTPS加密的概念有:公钥私钥对称加密非对称加密,下面一个个进行介绍:

  • 公钥:公开的密钥,任何人都可以知道这个秘钥及其解密算法。

  • 私钥:不公开密钥,一般是企业服务器内部私有。

  • 对称加密:加密使用的密钥和解密使用的密钥是相同的,不区分公钥私钥,实现对称加密需要通信双方先协商好一把密钥,用于在通信过程中解密加密信息,对称加密的特点是加密、解密的效率比较高。

  • 非对称加密:加密使用的密钥和解密使用的密钥是不相同的。也就是说使用公钥加密的内容必须使用私钥解密;使用私钥加密的内容必须使用公钥解密,非对称加密的加密、解密效率比对称加密低,下面是用Python的rsa模块实现一个非对称加密、解密的例子:

    import rsa
    (pub_key, priv_key) = rsa.newkeys(256)
    print pub_key # 公钥 PublicKey(95486814448401066618225108230378658095818087913775724964-908995323017037455049, 65537)
    print priv_key # 私钥 PrivateKey(95486814448401066618225108230378658095818087913775724964-908995323017037455049, 65537, 74777145397794954637032015955990110399713179956878421347933123063061797903213, 81554253653315495438198948774508679231171, 1170837941259476644908380749633106819)
    crypto = rsa.encrypt('hello world', pub_key) # 公钥对“hello world”进行加密
    print crypto # 使用公钥加密后的内容 ^���� 	ܹ��EXz�~J�pX   ���/7L��
    decrypt = rsa.decrypt(crypto, priv_key) # 使用私钥解密
    print decrypt # hello world
    

HTTPS的通信过程

假设一个服务器端支持HTTPS访问(即已经配置了SSL证书,该证书得到公开认可,这个证书上会有一对公钥和私钥),那么从客户端使用HTTPS发起请求到客户端、服务器端稳定通信的流程如下:

1.客户端发起请求

客户端发起HTTPS连接请求,告诉服务器要以HTTPS的方式进行通信。

2.服务器端传送证书

服务器端收到客户端的请求后,便会向客户端传送包含了公钥、颁发机构、过期日期等内容的数字证书,便于后面进行非对称加密使用。

3.客户端验证证书并发送签名信息

客户端收到服务器端发送的证书后,为了证明这个证书是”真正的”服务器端发出且可信的,而不是中间攻击者发出的,需要向CA机构服务器验证这个证书是否可信,若这个证书是CA机构不认可的,那么此时会发出警告,通知客户端此次通信存在安全问题:

1

如果数字证书验证通过,那么客户端需要验证当前跟他通信的服务器有私钥,此时客户端会生成一个随机数,使用证书上的公钥进行加密,这个随机数称之为数字签名

4.服务器端解密数字签名,并回传验证信息

服务器端收到公钥加密的数字签名后,便可使用私钥进行解密得到客户端的数字签名,随后该数字签名用私钥进行加密,作为一个验证信息回馈至客户端。

5.客户端验证服务器私钥

服务器使用私钥加密的签名信息发送到客户端后,根据非对称加密的原则,客户端可以使用公钥对这个加密信息进行解密,解密得到的签名信息再跟第三步的签名信息做比较,如果二者一致,那么证明当前通信服务器拥有私钥并且当前通信没有中间攻击者篡改通信信息,接下来可以愉快的进行通信了。此时客户端再次生成一个随机数,使用公钥加密后发送至服务器端,这个随机数作为接下来对称加密的密钥。

6.建立对称加密通信

服务器端收到第五步客户端发出的加密随机数后,使用私钥解密,那么此时,客户端和服务器端都拥有一个相同的随机数,客户端和服务器端都可以用对称加密算法来加密和解密通信内容了。

以上六个流程,第2-5步都是非对称加密,由于服务器私钥不对外公开,即使有中间攻击者对通信信息作出篡改或冒充,客户端和服务器端都能及时发现,从而保证第6步的对称加密密钥不落入第三方手中,整个流程如下图所示:

2

总结

HTTPS的加密通信流程基本就如上所述,涉及到的概念比较多,也比较抽象,建议反复阅读。事实上HTTPS相关的加密算法和通信过程要复杂的多,如果需要深入了解下去,还需要了解证书、SSL加密方式等一系列知识。

(完)

参考:

通俗易懂的解释HTTPS

图解SSL/TLS协议

数字证书原理


原创不易,如果觉得这篇文章对你有帮助,不如赏杯咖啡吧
微信
支付宝