什么是 HTTPS ?
上网时,无论是手机还是电脑,数据通信都是必不可少的。
如今,超文本传输协议HTTP(超文本传输协议)通常用于通过Internet 传输数据。
因此,当您上网时,您会看到所有URL 的前缀都是http://。
HTTP协议
简单来说,HTTP协议定义了一组规范,允许客户端或浏览器成功地与服务器通信并完成数据传输。
然而,HTTP 使用明文传输。例如,当我输入我的帐户/密码并提交登录时:
明文传输
HTTP并不安全,很可能被中间人窃听,导致数据泄露。地址栏中会出现一条消息,指出连接不安全。
Firefox 浏览器安全提示
为了解决安全传输的问题,人们发明了HTTPS,即HTTP+Secure。
为什么HTTPS 安全?
只要传输的数据是加密的,并且除了通信双方之外没有第三方能够解密数据,通信就是安全的。
加密通讯
在上面的例子中,通信数据是加密的,因此即使中间人截获,也无法得知其内容。
Firefox 浏览器安全提示
HTTPS 如何实现安全通信?
加密传输当然是安全的,但是客户端加密后,服务器如何解密数据呢?如何防止这种情况发生?
答案是使用对称加密技术。
什么是对称加密?
简单来说,通信双方拥有相同的密钥(所谓对称性)。客户端加密并锁定数据后,将其发送到服务器,服务器使用其密钥解密数据。同样,服务器可以加密数据并将其发送给客户端,客户端也可以使用其密钥解密数据。
所以一个新的问题出现了。在通信之前如何为双方分配两个相同的密钥?
如果你真正想沟通的人只有两个,你可以私下会面,并做一些分配,以便将来需要沟通时使用。然而,实际的通信通常是在服务器和数千个客户端之间进行,并且最初不可能允许每个人与服务器私下会面。
此外,即使使用对称加密技术,如果一方没有正确存储密钥,也会存在重大安全风险。最好在每个客户端每次通信时使用不同的密钥。与服务器密钥。
一个简单的解决方案是,在每次通信请求之前,客户端首先与服务器协商并使用某种方法生成只有双方都知道的对称密钥。
这个过程称为“密钥交换”。
密钥交换算法的实现有很多种,但常见的有:
Diffie-Hellman 密钥交换算法
RSA密钥交换算法
本文以更简单的RSA密钥交换为例
简单来说,RSA密钥交换算法需要客户端向服务器提供一个预主密钥,然后通信双方生成一个主密钥,最后根据该主密钥生成一系列后续密钥。包含发送数据时使用的对称密钥。
那么客户端如何直接以明文形式告诉服务器预主密钥呢?
我们之前提到过,未加密的通信可能会被拦截并且不安全。
看起来你陷入了无限循环。为了加密通信,必须首先将预主密钥发送到服务器,并且该传输必须被加密。
引入一种新的加密技术:非对称加密。
什么是非对称加密?
简单来说,服务器可以生成不同的密钥对(所谓的非对称密钥)。一个称为私钥,另一个称为公钥,每个人都可以看到。
该密钥对具有以下特点:用公钥加密的数据只能用私钥解密,用私钥加密的数据只能用公钥解密。
非对称加密的经典实现称为RSA 算法,该算法于1977 年由Ron Rivest、Adi Shamir 和Leonard Adelman 首次提出。 RSA 由您姓氏的首字母组成。
非对称加密技术使这个过程变得更加容易。
客户端使用服务器的公钥加密Pre-Master-Key 并将其发送到服务器。
只有服务器拥有私钥,因此只有服务器可以解密数据并检索客户端发送的预主密钥。
具体对话过程:
客户端向服务器请求公钥PublicKey。
服务器将公钥发送给客户端(这里没有保密要求,因为公钥对每个人都是可见的)。
客户端使用服务器的公钥PublicKey将Pre-Master-Key加密成密文PublicKeyEncryptedData并发送给服务器。
服务器使用私钥PrivateKey解密密文PublicKeyEncryptedData并检索客户端发送的Pre-Master-Key。
一切看起来都很完美,但第2 步引入了一个新问题。
由于互联网是公开的,从服务器发送到客户端的公钥在传输过程中可能会被中介拦截并篡改(所谓中间人攻击,简称MITM)。
中间人攻击
中间人还可以生成非对称密钥对,因此拦截服务器发送的公钥,并将自己的公钥MiddleMan-PublicKey发送给客户端进行欺骗。
我们可怜的客户居然相信了!然后,我愚蠢地用MiddleMan-PublicKey 加密了他的Pre-Master-Key 并将其发送给中介。
我怎么解决这个问题?
这个问题与“客户端如何确定它收到的公钥实际上是服务器的公钥?”相同。
考虑一下在登上高铁或飞机时如何向工作人员表明自己的身份。
答案很简单。到公安局(英文名称:Authority)领取身份证(证)。
身份证记录了您的号码、姓名、年龄、照片、地址、发证机构、有效期等。
因此,服务器也想办法从记录有服务器域名、公钥、隶属关系、颁发机构、有效期等的Authority处获取证书。
当客户端收到服务器发送的证书时,上面记录的公钥一定是真实的,除非该证书是伪造的。
证书是什么样的?
点击IE浏览器中的小锁即可查看服务器的证书
查看证书
但现在新的问题出现了:如何证明证书不是伪造的?
我们将介绍一种称为“签名”的防伪方法。
什么是签名?
在生活和工作过程中,我们经常会遇到需要签名的情况,比如刷信用卡或者签订合同,以证明这是我们的行为。签名是可靠的,因为从理论上讲,每个人的签名都有生理基础,并且像指纹一样,其他任何人都无法伪造。
因此,只要你的服务器发送的证书是由证书颁发机构签名的,你就可以确定该证书是颁发给你的服务器的,而不是别人伪造的。
这相当于HR只要请假单有领导签字,就确信领导批准了请假单。
如果用笔和纸进行人工签名,那么如何实现计算机数字签名呢?
答案是使用非对称加密。
数字证书颁发机构(也称为CA)生成公钥和私钥对。
服务器将域名、公钥等信息发送给CA审核。
CA审核正确,并使用私钥对服务器信息摘要进行加密。生成的密文就是所谓的签名。
CA将服务器信息、签名、有效期等信息收集成证书颁发给服务器。
客户端收到服务器发送的证书后,使用CA的公钥解密签名,如果与证书中记录的服务器信息摘要匹配,则获取服务器信息摘要。信息已获得CA 批准。
什么是信息摘要?
简单来说,经过信息汇总处理后,通过任意改变原始数据,就可以得到32字节等固定长度的数据。不同的。
然而,第5步提出了一个新问题。客户端如何知道CA的公钥?
答:先天性的
世界上只有少数根CA。当浏览器或操作系统发布时,它已经包含来自这些组织的自签名证书并记录其公钥信息。您也可以手动安装CA 证书。是必须的。
以Windows系统为例。
系统信任根证书
至此,HTTPS通信流程就已经清晰了。
您的操作系统/浏览器附带CA 根证书。
这样,客户端就可以验证服务器发送的证书的真实性,并检索服务器的公钥。
使用服务器的公钥,客户端可以将预主密钥发送到服务器。
服务器一旦获得Pre-Master-Key,就可以通过后续生成的对称密钥与客户端进行加密通信。
总结
本文简要介绍了HTTPS通信过程的基本原理,包括对称加密、非对称加密、信息摘要、签名、密钥交换等技术基础,以及颁发机构、数字证书等概念。
HTTPS的具体实现细节比较复杂,这里不做讨论,但这并不影响不熟悉HTTPS的读者对其原理的理解。
参考
传输层安全协议规范https://tools.ietf.org/html/rfc5246
HTTPS 连接的前几毫秒内会发生什么http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html
查看Windows系统根证书https://technet.microsoft.com/zh-cn/library/cc754841.aspx。
也欢迎大家关注、收藏、点赞!
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。