你了解https吗

Posted 一腔诗意醉了酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你了解https吗相关的知识,希望对你有一定的参考价值。


首发于个人博客


人人都知道,httpshttp安全,那你真的知道他为什么安全吗?

::: note

写这篇文章的原因是,我以为自己到了录用评估就可以顺利oc的情况下,结束了流程,本已准备阶段性躺平,但却无奈需要继续努力的情况下,去重新总结了一下自己的技术栈,发现对https始终存在疑惑,所以记录一下下吧。

:::


1. 简介

本文涉及大量github图片,建议开代理。

以下我将以这几个方向去展开自己对https的理解:

  1. 写作的基础或者说参考是什么?
  2. 关于密码学的一些小知识?
  3. https是什么?
  4. 为什么说它比http安全?
  5. 他是怎么做到安全的?
  6. 他真的绝对安全了吗?
  7. 怎么让他变得更加安全呢?
  8. 如何部署一个https网站?
  9. 总结一下?

详细内容

关于这篇博客的主要内容部分,可择善享用。

1. 参考

为了避免管中窥豹的尴尬,我前后回去阅读了以下书籍,以加深自己对https的理解。其中主要阅读了《深入浅出https》。如果时间充足,建议看看该书,必有收益。上层建筑做的再好,如果基础设施做得不好,不过就是徒劳罢了。毕竟,如果你不了解它,也就不知道我的理解是对还是错,阅读了也好像一无所获,这可不是一个写者所希望看到的。

::: note

  1. 《深入浅出HTTPS》 --虞卫东著
  2. 《信息安全概论》 – 清华大学出版社
  3. 《现代密码学教程第二版》 – 北京邮电大学出版社

:::

2. 关于密码学的一些小知识(可跳过)

包含RSA算法,Diffie-Hellman密钥交换算法,PKI的组成以及hash算法,mac等等。

2.1 RSA

RSA算法,主要涉及RSA公钥加密体制以及基于RSA的数字签名。

::: tips

  • 什么是RSA算法?

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算法有:

  1. MD5
  2. SHA1
  3. SHA256
  4. 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)

  • TLS/SSL的三大核心步骤:
  1. 认证
  2. 密钥协商
  3. 数据加密

  • TLS所在的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9S3IUTvl-1638100226950)(https://raw.githubusercontent.com/csDeng/vuePress/master/docs/05.运维/pics/image-20211128140915741.png)]

:::

4. 为什么说它比http安全?

首先,http是明文传输的,他所传输的所有信息,都可以被第三方抓包,当然https的传输数据包,也会被人抓包到,但是https所传输的数据,都是经过加密所得的密文,如果没有密钥,就算第三方截获到信息,他也无法就行解密,或者说解密的代价极大。所以说httpshttp安全。

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

可以看到,我们使用不同类型的密码套件,所需要的握手次数也不一样。

而密码套件其实就是各种加密所用的工具的大礼包,包含以下几个方面:

  1. 身份验证算法
  2. 密码协商算法
  3. 加密算法或者加密模式
  4. 等等

  • 使用RSA的密码套件

这种方法下的服务器证书中会包含服务器公钥,显得服务器的密钥对 格外重要,因为服务器公钥不仅仅要进行身份验证,还要进行密钥协商,一旦私钥泄露,就失去了前向安全性。

  • 使用静态DH算法

这种方法下,服务器证书中会包含固定的DH参数和DH公钥,也会失去前向安全性,所以现在的密码套件很少支持DH算法,CA机构在签发证书的时候也不会包含DH参数和DH公钥。

  • DHE算法和ECDHE算法

这两个算法和服务器的密钥对关系不大,即时服务器的私钥泄露,也不会造成太大的安全风险。

DHE的简单介绍

ECDHE 的简单介绍

(TLS/SSL 协议详解SSL中的RSA、DHE、ECDHE、ECDH流程与区别_Network/Storage/Linux Kernel-CSDN博客_ecdhe

:::

5.1.3 握手消息的完整性校验

客户服务端协商出密码块之后,代表可以对消息进行加密和完整性校验了,但是首先保护的并不是HTTP应用层的消息,而是握手的消息。

为什么要保护握手的消息呢?

因为握手消息也是明文传输的,证书能够确保服务器的真实身份,但是密钥协商是身份认证之后的过程。攻击者无法攻击身份的校验过程,但可以在后续的握手过程中进行消息的篡改。因为你能拿到服务器的公钥,攻击者当然也能拿到服务器的公钥,然后攻击者拦截你跟服务器的握手消息,然后篡改之后再发给服务器,拿到服务器的消息之后,再转给你。这其实就是中间人攻击。

::: note

为了避免消息被篡改,握手的过程就需要一种机制来避免消息的篡改,这也就是消息的完整性校验。

  • 校验过程主要分以下几个步骤:
  1. A将发送和接收到的所有握手消息组合在一起,然后计算出消息摘要,握手层使用密钥块对摘要数据进行加密和完整性保护,然后发送给B
  2. B收到消息之后,使用加密块解密出摘要数据。
  3. 紧接着B自行计算发送和接收到的所有握手消息,再计算消息的摘要数据,如果摘要数据和解密出的摘要数据一致,就代表A发来的消息没有被篡改。

:::

5.2 加密层

加密层就是使用握手层协商出来的套件对消息进行加密和完整性校验了。

常见的加密算法有

  1. 流密码加密模式

RC4等,被证明了不安全,很少使用

  1. 分组密码加密模式

AES,CBC也很少使用

  1. AEAD模式

AEAD是一种比较新型的加密模式,一步就能解决加密和完整性处理,不用填充,也不需要初始化向量。

TLS/SSL中主要使用AES-GSM模式。

6. 他真的绝对安全了吗?

其实,https保证的仅仅是当前连接是安全的,如果网站里面存在非https的内容,比如说<script src='http://a.js'></script>,那么当你打开网页的时候,浏览就会自动的去请求这个http请求,如果里面存在非法代码,那就会发生“故障”,这就是我们经常说的xss(cross site script)跨站脚本攻击啦。那么怎么避免呢?请看下一小节。

7. 怎么让他变得更加安全呢?

  1. 如果是新网站,那么我们可以在架构的时候,就考虑全局安全策略。如果是旧的网站,那么我们可以将非http请求的连接走代理(验证是否安全),然后旧的网站改请求https的资源。
  2. 设计HSTS标准
  3. 启动CSP内容安全策略。

8. 如何部署一个https网站?

开始部署https

8.1 部署https的必要条件

主要有3个条件。

8.1.1 证书和密钥对

获取证书的三种途径

  1. 向收费的CA机构申请证书
  2. 向免费的CA机构申请证书,比如说Let's Encrypt
  3. 生成自签名证书(通常只用于局域网)

证书主要包含两部分信息:

  1. 服务器的实体信息,包括服务器的主机名,服务器公钥等
  2. 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
  • 安装nginx
apt-get install nginx
  • 查看是否成功安装
service nginx -t
# 如果有版本显示则成功安装
  • 配置https
  1. 把证书和私钥放在特定的文件夹(通常放在/etc/nginx/下面)

  2. 编写配置文件

这里有人喜欢在nginx.config里面直接改,也有人喜欢在nginx-enabled/default里面改,仁者见仁智者见智,我喜欢后者。

server 
        #SSL 访问端口号为 443
        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; 
        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        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;
        
    
  1. 测试nginx配置是否成功
service nginx - t
# successfully 则成功
  1. curl测试https
curl https://xx.com
# 如果有信息返回,则初步配置成功

8.1.3 全站https的策略

  • http服务重定向到https

修改80server

server 
	listen 80 default_server;
	listen [::]:80 default_server;

	server_name xx.com; 
    #把http的域名请求转成https
    return 301 https://$host$request_uri; 
  
  • HSTS

::: tip

HSTS(Http-Transport-Security),它虽然不是TLS/SSL的一部分,却是保证https安全最有力的一个武器。

他其实就是利用一个响应头部,规范浏览器的一些行为,从而规避一些安全问题而已。

可参考这个

:::

  • CSP

::: tip

CSP(content security policy),一种内容安全策略,如使用得当,可避免xss攻击。

CSP其实也是一个响应头部,具体信息可参考内容安全策略( CSP ) - HTTP | MDN (mozilla.org)

:::


::: warning

涉及到的具体配置,可能因人而异,但整体思路,差不多,可多问度娘。

:::

9.总结

https主要包含身份认证、密钥协商、数据加密等三大方面,且加密主要分RSADH系。

参考网络资源

(44条消息) 公钥密码体制-RSA (一)_Henzox的专栏-CSDN博客

内容安全策略( CSP ) - HTTP | MDN (mozilla.org)

HSTS - 术语表 | MDN (mozilla.org)

以上是关于你了解https吗的主要内容,如果未能解决你的问题,请参考以下文章

(转) Java中的负数及基本类型的转型详解

你真的了解http,https吗?万字长文带你深入了解http!

你真的了解http,https吗?万字长文带你深入了解http!

写了这么久代码你了解Java面向对象的设计原则吗?

你了解https吗

你了解https吗