首发于个人博客
人人都知道,https 比http 安全,那你真的知道他为什么安全吗?
::: note
写这篇文章的原因是,我以为自己到了录用评估就可以顺利oc的情况下,结束了流程,本已准备阶段性躺平,但却无奈需要继续努力的情况下,去重新总结了一下自己的技术栈,发现对https始终存在疑惑,所以记录一下下吧。
:::
1. 简介
本文涉及大量github 图片,建议开代理。
以下我将以这几个方向去展开自己对https的理解:
- 写作的基础或者说参考是什么?
- 关于密码学的一些小知识?
- https是什么?
- 为什么说它比http安全?
- 他是怎么做到安全的?
- 他真的绝对安全了吗?
- 怎么让他变得更加安全呢?
- 如何部署一个https网站?
- 总结一下?
详细内容
关于这篇博客的主要内容部分,可择善享用。
1. 参考
为了避免管中窥豹的尴尬,我前后回去阅读了以下书籍,以加深自己对https 的理解。其中主要阅读了《深入浅出https》。如果时间充足,建议看看该书,必有收益。上层建筑做的再好,如果基础设施做得不好,不过就是徒劳罢了。毕竟,如果你不了解它,也就不知道我的理解是对还是错,阅读了也好像一无所获,这可不是一个写者所希望看到的。
::: note
- 《深入浅出HTTPS》 --虞卫东著
- 《信息安全概论》 – 清华大学出版社
- 《现代密码学教程第二版》 – 北京邮电大学出版社
:::
2. 关于密码学的一些小知识(可跳过)
包含RSA 算法,Diffie-Hellman 密钥交换算法,PKI 的组成以及hash 算法,mac 等等。
2.1 RSA
RSA 算法,主要涉及RSA 公钥加密体制以及基于RSA 的数字签名。
::: tips
RSA的基础是数论的欧拉定理,它的安全性依赖于大整数的因子分解的困难性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-waICJ4Iw-1638100226935)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128130316369.png)]
:::
2.1.1 RSA公钥加密体制
主要包含密钥生成、加密算法和解密算法三部分。(以下摘自书籍《现代密码学教程》)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6sD5WuM-1638100226937)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128131739932.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OislG3KU-1638100226939)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128131430477.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pcoXhc7e-1638100226941)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128131859441.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6jUN143b-1638100226944)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/微信图片_20211128132306.jpg)]
2.1.2 基于RSA的数字签名
2.2 Diffie-Hellman 密钥交换算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DpgTCTGe-1638100226946)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128133557483.png)]
2.3 PKI 的组成
一个典型的PKI系统包括PKI策略、软硬件系统、证书机构CA、注册机构RA、证书发布系统和PKI应用等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zmVewDDg-1638100226948)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128134017753.png)]
2.4 hash 算法
::: note
hash 函数,是一种将任意长度的输入变换成为一种固定长度输出的不可逆的单向函数,也称单向陷门函数。它的输出在密码学里也成为消息摘要。
常见的hash算法有:
- MD5
- SHA1
- SHA256
- SHA512
:::
2.5 MAC
在现代的网络中,身份认证是一个经常会用到的功能,在身份认证过程中,有很多种方式可以保证用户信息的安全,而MAC(message authentication code)就是一种常用的方法。
消息认证码是对消息进行认证并确认其完整性的技术。通过使用发送者和接收者之间共享的密钥,就可以识别出是否存在伪装和篡改行为。
MAC是通过MAC算法+密钥+要加密的信息一起计算得出的。
同hash算法(消息摘要)相比,消息摘要只能保证消息的完整性,即该消息摘要B是这个消息A生成的。而MAC算法能够保证消息的正确性,即判断确实发的是消息A而不是消息C。
同公私钥体系相比,因为MAC的密钥在发送方和接收方是一样的,所以发送方和接收方都可以来生成MAC,而公私钥体系因为将公钥和私钥分开,所以增加了不可抵赖性。
MAC有很多实现方式,比较通用的是基于hash算法的MAC,比如今天我们要讲的HMAC。还有一种是基于分组密码的实现,比如(OMAC,CBC-MAC and PMAC)。
HMAC算法及其应用 - 知乎 (zhihu.com)
3. https 是什么?
首先,可以简单认为
h
t
t
p
s
=
h
t
t
p
+
T
L
S
(
S
S
L
)
https = http + TLS(SSL)
https=http+TLS(SSL) ,什么意思呢?
构建在TCP之上的应用层协议(比如HTTP)都能结合TLS/SSL 协议,TLS/SSL 协议与关,他只是加密应用层协议,并传递给下层TCP 。
也就是说,https 就是http (一种明文传输,且无状态的一种应用层协议),利用TLS/SSL 加密应用数据然后向下传输给传输层的TCP 去完成数据通信的一种手段。
::: note
TLS(Transport Layer Security) 协议,是SSL 的升级版,详细信息,可参考TLS_百度百科 (baidu.com)。
- 认证
- 密钥协商
- 数据加密
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9S3IUTvl-1638100226950)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128140915741.png)]
:::
4. 为什么说它比http安全?
首先,http 是明文传输的,他所传输的所有信息,都可以被第三方抓包,当然https 的传输数据包,也会被人抓包到,但是https 所传输的数据,都是经过加密所得的密文,如果没有密钥,就算第三方截获到信息,他也无法就行解密,或者说解密的代价极大。所以说https 比http 安全。
5. 他是怎么做到安全的?
在通信之前,https 会先进行身份认证,然后进行协商得到密码套件,最后将http 的数据加密后进行传输。
::: tips
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bj4uGZ7f-1638100226951)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128144255919.png)]
::::
5.1 握手层
5.1.1 认证:
故名思意,就是要达到“证明你是你”的目的。那么怎么证明,你是你呢,可能不能说让你自己说,我是我吧。我们得借助可靠的第三方。这个过程,可以想象成我们需要身份证去证明我是我。
在TLS/SSL 中,客户端在进行密钥交换之前,我们需要通过CA 机构来认证服务器身份,否则就会存在中间人攻击。
5.1.2 密码套件协商
认证完身份之后,我们可以确定了跟我们讲话的小明就是小明。接下来,我们就可以进行密码套件的协商了。
先来宏观地认识一下,协商的大概过程。
::: note
可以看到,我们使用不同类型的密码套件,所需要的握手次数也不一样。
而密码套件其实就是各种加密所用的工具的大礼包,包含以下几个方面:
- 身份验证算法
- 密码协商算法
- 加密算法或者加密模式
- 等等
这种方法下的服务器证书中会包含服务器公钥,显得服务器的密钥对 格外重要,因为服务器公钥不仅仅要进行身份验证,还要进行密钥协商,一旦私钥泄露,就失去了前向安全性。
这种方法下,服务器证书中会包含固定的DH 参数和DH 公钥,也会失去前向安全性,所以现在的密码套件很少支持DH 算法,CA 机构在签发证书的时候也不会包含DH 参数和DH 公钥。
这两个算法和服务器的密钥对关系不大,即时服务器的私钥泄露,也不会造成太大的安全风险。
DHE的简单介绍
ECDHE 的简单介绍
(TLS/SSL 协议详解SSL中的RSA、DHE、ECDHE、ECDH流程与区别_Network/Storage/Linux Kernel-CSDN博客_ecdhe
:::
5.1.3 握手消息的完整性校验
客户服务端协商出密码块之后,代表可以对消息进行加密和完整性校验了,但是首先保护的并不是HTTP 应用层的消息,而是握手的消息。
为什么要保护握手的消息呢?
因为握手消息也是明文传输的,证书能够确保服务器的真实身份,但是密钥协商是身份认证之后的过程。攻击者无法攻击身份的校验过程,但可以在后续的握手过程中进行消息的篡改。因为你能拿到服务器的公钥,攻击者当然也能拿到服务器的公钥,然后攻击者拦截你跟服务器的握手消息,然后篡改之后再发给服务器,拿到服务器的消息之后,再转给你。这其实就是中间人攻击。
::: note
为了避免消息被篡改,握手的过程就需要一种机制来避免消息的篡改,这也就是消息的完整性校验。
A 将发送和接收到的所有握手消息组合在一起,然后计算出消息摘要,握手层使用密钥块对摘要数据进行加密和完整性保护,然后发送给B 。B 收到消息之后,使用加密块解密出摘要数据。- 紧接着
B 自行计算发送和接收到的所有握手消息,再计算消息的摘要数据,如果摘要数据和解密出的摘要数据一致,就代表A 发来的消息没有被篡改。
:::
5.2 加密层
加密层就是使用握手层协商出来的套件对消息进行加密和完整性校验了。
常见的加密算法有
- 流密码加密模式
RC4等,被证明了不安全,很少使用
- 分组密码加密模式
AES,CBC也很少使用
AEAD 模式
AEAD 是一种比较新型的加密模式,一步就能解决加密和完整性处理,不用填充,也不需要初始化向量。
在TLS/SSL 中主要使用AES-GSM 模式。
6. 他真的绝对安全了吗?
其实,https 保证的仅仅是当前连接是安全的,如果网站里面存在非https 的内容,比如说<script src='http://a.js'></script> ,那么当你打开网页的时候,浏览就会自动的去请求这个http 请求,如果里面存在非法代码,那就会发生“故障”,这就是我们经常说的xss(cross site script)跨站脚本攻击啦 。那么怎么避免呢?请看下一小节。
7. 怎么让他变得更加安全呢?
- 如果是新网站,那么我们可以在架构的时候,就考虑全局安全策略。如果是旧的网站,那么我们可以将非http请求的连接走代理(验证是否安全),然后旧的网站改请求
https 的资源。 - 设计
HSTS 标准 - 启动
CSP 内容安全策略。
8. 如何部署一个https网站?
开始部署https
8.1 部署https 的必要条件
主要有3个条件。
8.1.1 证书和密钥对
获取证书的三种途径
- 向收费的
CA 机构申请证书 - 向免费的
CA 机构申请证书,比如说Let's Encrypt - 生成自签名证书(通常只用于局域网)
证书主要包含两部分信息:
- 服务器的实体信息,包括服务器的主机名,服务器公钥等
CA 机构的信息,比如说CA 机构的数字签名算法标识符、签名值等。
比如我的个人博客的证书(向腾讯云申请的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqQ6oBsj-1638100226956)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128165222081.png)]
8.1.2 部署和配置https 网站
以nginx 为例
环境:
ubuntu 20.04
apt-get install nginx
service nginx -t
-
把证书和私钥放在特定的文件夹(通常放在/etc/nginx/ 下面) -
编写配置文件
这里有人喜欢在nginx.config 里面直接改,也有人喜欢在nginx-enabled/default 里面改,仁者见仁智者见智,我喜欢后者。
server {
listen 443 ssl;
server_name xx.com;
ssl_certificate /etc/nginx/你的crt后缀的证书;
ssl_certificate_key /etc/nginx/你的key私钥;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /var/www/html;
index index.html index.htm;
}
}
- 测试
nginx 配置是否成功
service nginx - t
curl 测试https
curl https://xx.com
8.1.3 全站https 的策略
修改80server
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name xx.com;
return 301 https://$host$request_uri;
}
::: tip
HSTS(Http-Transport-Security) ,它虽然不是TLS/SSL 的一部分,却是保证https 安全最有力的一个武器。
他其实就是利用一个响应头部,规范浏览器的一些行为,从而规避一些安全问题而已。
可参考这个
:::
::: tip
CSP(content security policy) ,一种内容安全策略,如使用得当,可避免xss 攻击。
CSP 其实也是一个响应头部,具体信息可参考内容安全策略( CSP ) - HTTP | MDN (mozilla.org)
:::
::: warning
涉及到的具体配置,可能因人而异,但整体思路,差不多,可多问度娘。
:::
9.总结
https 主要包含身份认证、密钥协商、数据加密等三大方面,且加密主要分RSA 和DH 系。
参考网络资源
(44条消息) 公钥密码体制-RSA (一)_Henzox的专栏-CSDN博客
内容安全策略( CSP ) - HTTP | MDN (mozilla.org)
HSTS - 术语表 | MDN (mozilla.org)
|