从头到尾谈一下HTTPS

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 如果面试这样说的话那差不多就gg了,其实HTTPS要展开回答的话内容还挺丰富的。本篇文章详细介绍了HTTPS是什么、为什么安全以及实现安全的方法,一起来学习吧。

引言

“你能谈一下HTTPS吗?”

“一种比HTTP安全的协议。”

“...”

如果面试这样说的话那差不多就gg了,其实HTTPS要展开回答的话内容还挺丰富的。本篇文章详细介绍了HTTPS是什么、为什么安全以及实现安全的方法,一起来学习吧。

本文略长,请保持耐心。

https是什么?

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。之所以安全是因为它在将HTTP报文发送给TCP之前,先将其发送给了一个安全层(通过SSL协议实现)对报文进行加密。


247a5e9ad59895fbf2f662d86c717ede21842fbd

报文加密的优点

  • 保证客户端和服务器的对话不会被其他人窃听
  • 保证双方发送的数据不会中途被修改
  • 确保双方的身份是真实客户端/服务器而不是伪造的客户端/服务器

不妨将报文想象成A给B写的一封信,A将信放在一个有锁的盒子里,那么旁人就不能获取信的内容也不能篡改信了。

加密机制

先了解几个术语

  • 明文:未加密的报文
  • 密文:通过加密算法加密后的报文
  • 密钥:改变加密算法行为的参数

比如我们有一个加密函数,算法如下



function E(key, p) {
    // 将p的每一个字母向右移动key位,比如key为3则A-->D、B-->E...
}

E(3, "AB"); // DE  

明文: "AB" ------ 密文: "DE" ------ 密钥:3

如果我们的密钥不一样那么我们的加密函数执行结果就会不同。

下面来看一下常见的几种加密机制。

对称加密

我们之前说过,让报文加密是为了保证我两的聊天内容是秘密的,只有我两能看懂,别人看不懂。那么我们要约定一个加密方式,比如咱俩递小纸条交流的时候把小纸条装在一个盒子里,然后只有我们有这个盒子的钥匙。其他人就算拿到这个盒子他也打不开,那就无从窃取内容了。

对称加密就是这个意思:发送方用密钥将明文加密,接收方用同样的密钥解密。

虽然安全性得到了保障,但是还是存在两个问题:

  • 发送双方约定密钥时需要将密钥在网络传输,可能会造成密钥泄露,安全得不到保障。
  • 就是发送方与接收方在互相对话之前一定要有有一个共享密钥。试想,如果N个客户端都要与服务器建立安全通信,那么服务器需要保存N个密钥,N和客户端和N个服务器通信,那么将有N^2个密钥,管理起来非常不便。

非对称加密

非对称加密和对称加密是反着干的,对称加密是使用同一个密钥,而非对称加密使用了两个不同的密钥:公钥、私钥,一个密钥加密的内容只能由另一个密钥解开。

公钥是众所周知的,而私钥只有主机才持有。

服务器生成了公钥A和私钥B,当客户端想给该服务器发送报文时,首先找到服务器的公钥,然后根据公钥A将报文加密,服务器用私钥B解密。同理,当服务器想给该客户端发送报文时,首先找到客户端的公钥C,然后根据公钥C将报文加密,客户端用自己的私钥D解密。

在确保了信息安全的同时又可以方便密钥的管理。

由此,对称加密和非对称加密的区别是:

. 对称加密 非对称加密
密钥 加密解密用相同密钥 公钥、私钥,一个加密另一个解密
密钥管理 密钥数量大,不方便 每个主机只需管理一对公钥、私钥
安全性 不安全(并非该机制不安全,而是双方在约定密钥时可能会密钥泄露) 安全(不需要通过对话约定密钥)
加/解密速度

那HTTPS是采用的什么机制呢?

HTTPS加密机制

剧透,HTTPS对报文采用的对称加密。

完整的一次HTTPS交流

(1) 客户端通过TCP三次握手建立到服务器端口443(HTTPS的默认端口)的TCP连接

(2) 客户端通过SSL握手建立安全层

(3) 客户端发送http报文到SSL安全层,安全层将报文加密后发给TCP --> IP --> ...

(4) 同理服务器发送响应,客户端接收后通过SSL安全层解密发给应用层

(5) SSL安全层关闭通知

(6) TCP关闭连接

从上面的描述可以清晰的看到我们的报文加密/解密都是在SSL安全层执行。

那么安全层是怎么加密的?密钥又是怎么约定的?这一切的一切都得仔细聊聊第(2)步骤。

SSL握手

(1) 客户端向服务器发送可供选择的加密算法并请求证书。

客户端说:“嘿,小子。我这里有一堆我支持的加密算法,你选一个你喜欢的发给我。对了,顺便把你的身份证复印件发给我看看,我怕我连接的服务器是伪造的。”

(2) 服务器发送选中的加密算法和证书

服务器说:“emmm...我看加密算法A挺好的,咱俩就用这个吧。证书也发给你,证明我不是坏人。”

(3) 客户端保存服务器选择的加密算法和秘钥A以作为日后加密,将A用服务器的公钥B加密后发给服务器,服务器用自己的秘钥C解密后得到A,从此客户端和服务器都用约定的加密算法以及秘钥A进行对称加密。

(看到了伐?先用非对称加密在网络中传输对称加密的秘钥A,之后对报文都是采用对称加密啦。)

(4) 客户端和服务器互相告知,开始加密过程。

在SSL握手之后我们就可以开开心心的发送和接收加密报文啦。

以上是HTTPS加密的全过程,不过还不足以构成完整的HTTPS,因为完整的HTTPS要保障两个方面的安全:报文安全、身份安全,加密只能保证报文是安全的,不能保证身份是正确的。

试想,A和B互相写信并且交换盒子钥匙,然后将信放盒子里寄出去,上面的加密行为可以让A和B之间写的信内容不会被他人获取,但是如果一开始和A通信的就不是B呢?是窃取者C伪装成B和A通信,那么A会和C在SSL的时候就交流钥匙然后C可以窃取A写给B的信的内容。

身份的认证我们用数字证书。

数字证书

含有数字证书的报文的结构:

刚刚SSL握手的第(1)步还记得伐?客户端向服务器索要证书,这个证书是服务器可以证明自己身份的东西,该证书里包含了服务器的一些基本信息,比如站点的DNS主机名、该站点组织名、站点的公钥(发公钥就是为了让客户端SSL方便执行握手(3))等,以及证书的序列号、证书签名算法、过期日期等证书信息。

数字签名

证书是一个站点的身份证,但是身份证也可以被伪造,为了保证这个证书是真的我们需要数字签名。我们会将证书内容用签名算法生成一个值,我们称之为“摘要”。然后将该摘要用主机的私钥加密,加密后的内容就是我们的数字签名。


6ee660d06d2a8c0cbbce4aa00c9e8f7ab20a4f67
当客户端收到附带数字签名的数字证书时,会通过数字证书中的证书签名算法将该证书生成一个摘要,在用服务器众所周知的公钥解密数字签名,看得到的摘要是否相同,相同那就说明证书是真的。

如果公钥解密后得到的摘要与生成的摘要不符那么可能有两种情况

  • 发送方身份不是目的主机
  • 目的主机发送的证书被篡改

bf1e51539812d81318a80dcd49f225a994fe648a

数字证书和加密就构成了一个完整的HTTPS事务。

总结

  • HTTPS之所以安全是因为有两个保障
    • 双方的会话内容加密,旁人不能窃取
    • 双方的身份是真实的,防止窃取者伪造身份
  • 内容安全
    • 非对称加密机制加密“对称加密所需密钥”
    • 对称加密机制加密报文
  • 身份安全
    • 数字证书
    • 数字签名
      • 确认发送方身份
      • 确认证书未被篡改

参考书籍:

《HTTP权威指南》



原文发布时间为:2018年06月21日
原文作者:windlany
本文来源:  掘金  如需转载请联系原作者
相关文章
|
1天前
|
安全 算法 网络安全
HTTPS原理
HTTPS 通过加密、数字证书、握手过程等多种手段,确保了网络通信的安全和可靠。它为用户提供了更高级别的隐私保护和数据安全,是现代互联网中重要的安全保障机制。随着网络安全威胁的不断增加,HTTPS 的应用也越来越广泛,成为保障网络安全的重要基石。
|
2天前
|
安全 应用服务中间件 Linux
判断一个网站是否使用HTTPS协议
判断一个网站是否使用HTTPS协议
11 4
|
2月前
|
安全 网络安全 数据安全/隐私保护
https的原理
https的原理
57 2
|
存储 安全 算法
HTTPS 原理你真的知道吗?
HTTPS 原理你真的知道吗?
|
安全 网络协议 网络安全
HTTPS的安全体现在什么地方?
HTTPS的安全体现在什么地方?
|
算法 安全 网络安全
面试官:“你知道什么情况下 HTTPS 不安全么”
面试官:“你知道什么情况下 HTTPS 不安全么”
|
存储 Web App开发 安全
面试题之 HTTPS 为什么是安全的?
我们在浏览器中通信用的比较多的是 HTTP 和 HTTPS 两种协议,但是用 HTTPS 时浏览器总是会有一个小锁的标志,提醒我们这是安全链接,而 HTTP 它就会提醒我们这是不安全的链接,好家伙,只
|
自然语言处理 安全 网络安全
讲讲HTTPS那些事儿
前言最近在做 CSB 网关的过程中,开发了一个需求,支持 ”TLS 双向认证“。双向认证听起来比较高级,其实也不难,不过是单向认证的“加强版”。单向认证是客户端认证服务端,而双向认证则是在单向认证的基础上,增加了服务端认证客户端这一过程。单说单向认证这个词,你可能不是很熟悉,但是提到 HTTPS,应该会恍然大悟吧,经典的 HTTPS 协议中,其实就是用到了 TLS 单向认证。正好借这个机会,我对 
|
安全 JavaScript 小程序
HTTPS 终于搞懂了 ! 上
HTTPS 终于搞懂了 ! 上
|
设计模式 安全 算法
HTTPS 终于搞懂了 ! 下
HTTPS 终于搞懂了 ! 下