【深入浅出HTTPS】

您所在的位置:网站首页 ads8866驱动 【深入浅出HTTPS】

【深入浅出HTTPS】

2023-07-24 10:54| 来源: 网络整理| 查看: 265

文章目录 HTTP介绍密码学1.基础2.随机数3.Hash算法4.对称加密算法4.1 流密码算法4.2 块密码算法4.3 填充标准 5.消息验证码6.非对称加密算法7.密钥8.密钥协商算法(如何在网络中传输秘钥)⑴RSA密钥协商算法(完全客户端控制)⑵DH密钥协商算法 9.椭圆曲线密码学10.数字签名11.DSA数字签名算法12.算法安全性和性能⑴推荐密钥长度⑵密码学性能 宏观理解TLS1.TLS/SSL协议综述2.TLS/SSL协议背后的算法⑴加密算法和MAC算法⑵密钥协商算法⑶向前安全性⑷密钥衍生算法⑸中间人攻击⑹PKI★ 3.HTTPS总结4.实施HTTPS网站的必要条件5.从使用浏览器的用户角度来看HTTPS⑴被动混合内容⑵主动混合内容 选择HTTPS的必要性和疑惑快速搭建一个HTTPS网站1.HSTS标准2.CSP 证书1.证书2.证书链3.CRL 证书吊销列表⑴证书过期和吊销 ⑵CRL⑶CRL的问题4.OCSP CRL的替代者⑴OCSP基础⑵OCSP封套 5.证书透明度 Let's Encrypt免费证书TLS协议分析1.如何理解RFC文档2.TLS/SSL协议概述⑴握手协议⑵记录层协议 3.扩展4.会话恢复⑴Session ID的工作原理⑵SessionTicket的工作原理 HTTPS性能和安全1.密码套件2.安全性3.性能 HTTPS网站实践1.工具化配置HTTPS2.自动化测试HTTPS3.OpenSSL命令行工具4.使用Ngnix + OpenSSL部署HTTPS网站

HTTP介绍 HTTP,超文本传输协议,超文本指的是HTMLHTTP目前版本是1.1,定义在RFC2616规范上在HTTP中,客户端通过Socket技术创建一个TCP/IP连接,并连接到服务器就算是我们把内容加密,但是HTTP头部信息也是安全关注点之一用户访问网站一般会经过互联网服务商,服务商有时会在响应中加上一段HTML代码当广告 密码学 1.基础 HTTPS本质上是对密码学算法的组合在密码学中,一般使用消息验证码(MAC)算法来保证完整新在密码学中,一般使用数字签名来确认身份OpenSSL项目包含了底层密码库和命令行工具,Linux一般自带 2.随机数

在这里插入图片描述

单纯从软件层面无法生成完全不一样的随机数,为了实现真正不可重现性,需要基于物理设备或物理现象对于真正的随机数生成器,内部数值来自外部设备,叫做熵对于伪随机数生成器,内部数值来自模拟的数值,叫做种子随机数生成器一般会尽可能寻找更多的熵和种子 3.Hash算法 一些基础的密码学算法(加密基元)构成更多的密码学算法,协议以及应用程序密码学Hash算法就是一个非常重要的加密基元,它和一般Hash算法不同,多了更多的特性基于密码学Hash算法产生的其他密码学算法 在这里插入图片描述密码学Hash算法的公式 hash(入参) = 摘要,散列,或者叫指纹密码学Hash算法的特性 相同入参,出参一样一个算法,不管入参长度,出参长度总是一样的不可逆很难找到两个不同的消息,结果一样 两个不同的入参得到相同的出参,就代表发生了hash碰撞密码学Hash算法分类 MD5 本质上不安全,大量运算会产生碰撞SHA,包括SHA-1 SHA2 SHA-3 一般SHA2就安全了 在这里插入图片描述 4.对称加密算法 AES是对称加密算法的标准算法对称加密算法有两种类型,块密码算法和流密码算法 4.1 流密码算法 密钥流一个流式的二进制字符串,和入参变成的二进制串进行按位进行异或密钥流是由密钥生成,基于同一个密钥,加密者和解密者有着相同的密钥流流密码算法不安全,建议使用块密码算法 4.2 块密码算法

简单来说,就是把明文分块,每块要固定长度,不够的化就进行填充,然后进行加密

4.3 填充标准

我们这里已PKCS#7为例,如果填充的字节长度是3,那么填充就是030303,这样就可以方便的看出填充到底有几位

5.消息验证码

对称加密算法能够解决机密性问题,但是无法确保完整性,攻击者可以修改密文,接收方解密出来的就不是原文了

通过Hash算法生成摘要,攻击者可以同时更改消息和摘要,来达到篡改消息的目的,Hash算法能做完整性校验,但是不能避免消息被篡改,消息验证码因而诞生了

MAC值 = mac (消息 + 秘钥)

秘钥需要双方共同维护一个,然后通过比较MAC值来防止消息被篡改

在这里插入图片描述 结合对称加密和MAC算法,可以提供机密性和完整性的模式叫做AE加密模式

6.非对称加密算法 因为性能比较差,一般用于秘钥协商或者数字签名最经典的是RSA算法公钥和私钥一般以文件的形式提供同样的明文,同样的秘钥,经过RSA加密,每次的密文都不是一样的 7.密钥 密钥的分类 在这里插入图片描述 密钥要保证足够的长度以及不可预测性 8.密钥协商算法(如何在网络中传输秘钥) 什么是会话秘钥 作用是为了加密解密通讯数据在通讯数据之前通过密钥协商算法客户端和服务端协商出会话秘钥,一旦连接关闭,秘钥消失 ⑴RSA密钥协商算法(完全客户端控制) 服务端发送公钥给客户端客户端通过公钥加密会话秘钥,然后发给服务器端公钥是完全公开的,不能确认是哪个客户端发送的,因而会出现抵赖 ⑵DH密钥协商算法

通讯双方任何一方无法独自计算出一个会话密钥,通讯双方各自保留一部分关键信息,再讲另外一部分信息告诉对方,双方有了全部信息才能计算出相同的会话秘钥

9.椭圆曲线密码学

秘钥越长,性能越低,因而有了椭圆曲线密码学(ECC)来提高性能

ECC极短的秘钥能够提供很大的安全性

可以和DH秘钥协商算法组合形成ECDH秘钥协商算法结合数字签名DSA形成ECDSA数字签名算法 10.数字签名

RSA和DSA都可以实现数字签名

数字签名有以下几个特点

防篡改 MAC算法也有这个特点防抵赖 消息签署者不能抵赖防伪造 MAC算法也有这个特点

数字签名的处理流程包括签名生成和签名验证

签名生成(发送者)

对消息计算摘要用私钥对摘要值进行签名得到签名值将原始消息和签名值一起发送给接受者,原始消息不需加密,因为数字签名不是为了加密

签名验证(接受者)

拆分出消息和签名值A用公钥对消息进行运算,得到摘要值BB和A比较,相同则成功 11.DSA数字签名算法

它只能用来签名,不能用来加密解密

它能结合ECC(椭圆曲线密码学),成为ECDSA数字签名算法 12.算法安全性和性能 ⑴推荐密钥长度

在这里插入图片描述

⑵密码学性能 AES比RSA要快很多DSA比RSA慢很多 宏观理解TLS 1.TLS/SSL协议综述 TLS是SSL协议的升级版,目前比较稳定的版本是1.2TLS/SSL协议是互联网最常见的安全解决方案TLS/SSL主要构建于TCP之上,但是也可以构建于UDP之上OpenSSL也实现了TLS/SSL协议,OpenSSL是一个底层密码库,封装了所有的密码学算法,证书管理,TLS/SSL协议实现OpenSSL库包括两种类型的库 crypto库函数,具体算法,属于底层库的库EVP接口,进一步抽象crypto 2.TLS/SSL协议背后的算法

TLS/SSL核心 三大步骤

认证,需要结合PKI技术,PKI核心是证书密钥协商数据加密 ⑴加密算法和MAC算法

加密可以采用对称加密或者非对称加密,有加密有一定有MAC算法★

由于非对称加密效率低,所以加密主要还是用对称加密,但是协商密钥还得靠非对称加密算法

⑵密钥协商算法

在每次初始化连接时,客户端和服务端需要协商出一个预备密钥,会话结束,密钥销毁,一般通过RSA或者静态/临时DH算法来协商

我们以RSA协商预备密钥为例:

服务端将公钥发送给客户端客户端生成预备密钥公钥加密之后发送给服务端

静态DH算法DH参数和公钥每次连接可以是一样的,临时的则每次会话就失效

⑶向前安全性

RSA,静态/临时DH算法,只有临时DH算法可以提供向前安全性,因为每次连接都是重新生成,就算泄漏,也只是一次会话

⑷密钥衍生算法

就是将协商出的预备密钥转换成可以使用的密钥块,TLS/SSL中一般使用PRF函数

要注意,在TLS/SSL中,每次生成的预备主密钥是不一样的,就算一样,由于PRF的作用,转换出的密钥块也是不一样的★

⑸中间人攻击

中间人可以冒充服务器,将中间人自己的公钥发送给客户端来进行密钥协商,这个时候就需要PKI了

⑹PKI★

PKI不是TLS/SSL的一部分,它主要是确保客户端收到的公钥确实是服务端发送过来的

在HTTPS中,必须引入PKI技术才能确保安全,PKI由多个部分组成

服务器(我们可以把它想象成人)客户端(可以把它想象成BANK)CA机构(就像GOV)

CA机构(GOV)会给服务器(人)一张CA证书(身份证),客户端(BANK)会信任它

客户端如何校验CA整数呢,这就要通过数字签名技术了

CA机构使用私钥(这对秘钥和上面的秘钥无关)对证书进行数字签名然后发送给服务器,客户端持有公钥,浏览器把证书发给客户端之后,客户端用公钥解密,一旦校验成功,就说明CA证书可信,然后就查看证书里面的域名是不是对应的服务器

那浏览器的公钥如何安全拿到呢?浏览器会集成了CA机构的根证书,里面就有对应的公钥

如何申请CA证书呢?

服务器申请,生成一个包含RSA密钥,营业执照的CSR文件审核成功后,CA机构就会再用自己的密钥对的私钥和CSR结合生成证书文件给服务器

客户端如何校验证书呢

客户端发送请求服务器将证书(里面包含了通讯用的RSA公钥)客户端解密证书,验证证书成功,拿出通讯用的RSA公钥,这样就知道服务端的公钥了 3.HTTPS总结

TLS/SSL主要分为握手层和加密层

握手层主要目的是协商出通讯使用的秘钥,要注意HTTP是没有握手的过程的加密层的主要目的就是进行机密性和完整性的保护 4.实施HTTPS网站的必要条件 生成密钥对,并申请证书实施全站HTTPS来保证安全,而不是单个URL 网站涉及的所有域名网站的引用元素,需要支持HTTPSHTTP请求需要重定向到HTTPS上 5.从使用浏览器的用户角度来看HTTPS

当一个HTTPS页面引用了非HTTP元素,则代表页面出现了混合内容,代表该页面是不安全的,可能遭遇各种Web攻击,比如XSS攻击

⑴被动混合内容 audioimgvideoobject

这些标签HTTPS一般仍然会加载,一般会出现下面内容,不显示小锁 在这里插入图片描述

⑵主动混合内容 scriptlinkXMLHttprequest请求对象iframeobject对象

主动混合内容危害交大,大部分都会有如下提示,一般浏览器会默认禁止

在这里插入图片描述

选择HTTPS的必要性和疑惑 以目前的硬件水平来看,HTTPS对性能影响不大如果外部资源不支持HTTP,服务器可以待见一个HTTPS服务代理外部HTTPS资源HTTP5很多API需要运行在HTTPS上 快速搭建一个HTTPS网站 证书中一个关键信息就是域名,需要根据域名选择不同的证书类型,避免使用多级域名可以降低成本获取证书有三种 自签名证书,适合企业内部用Let’s Encrypt证书,免费CA机构颁发收费CA机构证书 搞好证书后,需要在HTTPS中配置证书和秘钥对路径可以配置nginx将80端口重定向到HTTPS的地址GET支持重定向,POST不支持重定向 1.HSTS标准

它的头部:Strict-Transport-Security,通过HSTS,可以

自签名证书直接截止访问www.XXX直接客户端定向到https,而不是服务端重定向

具体使用:

一般和重定向配置使用,由服务端输出,当用户采用HTTP访问服务器返回301重定向到HTTPS,HTTPS返回一个HSTS头部,然后以后客户端就直接重定向了,可以通过NGINX配置

HSTS头包含preload属性,如果浏览器维护的HTTPS域名列表有这个网站,那么不用重定向也采用HTTPS访问

2.CSP

CSP主要是解决混合内容的问题,CSP也是一个头部,CSP HTTPS和HTTP都可以使用

我们可以修改NGNIX配置文件,可以定制的允许客户端加载指定协议(比如HTTP)链接,或者完全不允许加载混合内容

CSP不是HTTPS的一部分,它是处理混合内容的一种方式

证书

PKI和证书是HTTPS的关键一环,他们不是TLS/SSL的一部分

1.证书 证书里面包含了证书签名的算法以及证书的内容等CSR文件主要用于申请证书,包含域名,公钥,企业信息等证书根据验证模式分类,DV,OV,EV证书,他们审核难度越来越大,一般重要客户会用EV,个人网站用DV,Let’s Encrypt只有DV注册域 就是服务器购买的域名,比如caibin.com可以包含www.caibin.com www1.caibin.com多个子域名证书根据域名可以分为 单域名证书,包含一个域名泛域名证书,可以将多个同级的域名合并到一张证书,注意同级,www1.www.caibin.com和www2.www.caibin.com能合并到www.caibin.com但是不能合并到caibin.comSAN证书,多个注册域合并SAN泛域名证书 ,有泛域名和SAN证书所有特定 另外我们要注意,一个企业不应该使用多级主机吗,比如example.com和*.www.example.com 2.证书链

对于证书来说,最重要的就是证书链,HTTPS网站需要正确部署证书链,浏览器需要正确校验证书链

下面我们查看一条证书链: 在这里插入图片描述 从下往上一次是服务器实体证书,中间证书,根证书,上一层证书签发下一层证书

通过Ngnix配置服务器证书时,不需要配置根证书,因为它是嵌入到浏览器中的

除了根证书,每个证书的签发者都是它上一级证书的使用者: 在这里插入图片描述 信任链校验: 信任链校验主要是校验服务器实体证书,中间证书签名是否正确,注意,非根证书签名使用的公钥来至上一级证书,根证书的则来自它自己

当客户端连接到服务端时,服务端需要发送除了根证书以外完整的证书链给浏览器(不完整的话有时浏览器也会主动找)浏览器需要确保每个证书签发者是它上一级使用者浏览器从服务器实体证书上一级证书获取公钥,校验服务器实体证书签名中间证书再往上找,一直找到根证书为止根证书自我校验,完事

一般在Linux和Windows中都集成了根证书,例如Linux OpenSSL库会集成根证书

根证书不会直接签发服务器实体证书,而是由中间证书签发服务器实体证书,这样可以减少根CA机构工作量,便于CA本土化,升级更方便,代理机构要保证安全

3.CRL 证书吊销列表 ⑴证书过期和吊销 证书过期不代表吊销证书过期肯定失效证书不过期不一定有效证书吊销一般是因为服务器发现私钥泄漏了 ⑵CRL 目前已经被OSCP技术取代是TLS/SSL的一部分它是一个相当于一个黑名单文件,在互联网上有个URL地址以及很多分发点浏览器下载并缓存,如果要访问的网站在里面,说明被吊销了 ⑶CRL的问题 吊销的证书太多了不是实时更新,CA机构和浏览器缓存都不会实时更新下载CRLs文件太麻烦一般检查完CRLs才会解除阻塞TLS/SSL握手,这样太慢了 4.OCSP CRL的替代者 ⑴OCSP基础 它也是一个URL,但是浏览器可以加上查询某张证书的查询条件,这样就快多了它更新很快,不仅能提供吊销状态,还可以体用其它的它不属于TLS/SSL的部分,很老的浏览器不支持,Chrome对于非EV证书,也默认不用它,而是谷歌自己的技术 ⑵OCSP封套

单纯使用OCSP技术的问题:

隐私性不高,用户会发送有查询条件的查询请求OCSP大多实时查询,服务器压力大

OSCP封套技术:

和标准OSCP比较,不再由浏览器发送OSCP请求,而是证书部署者,也就是服务器来发送,浏览器仅仅是接受响应浏览器发送一个status_request扩展请求给部署者,部署者去查询然后返回给浏览器部署者一般会缓存OCSP响应

OSCP的优点:

用户隐私性好由服务器发出请求并缓存,查询效率非常高(最重要的原因) 等等 5.证书透明度

证书透明度是证书的一种监控机制,域名持有放可以查看到目前所有域名对应的证书,一旦有冒充的,就可以快速发现,主要在Chrome中使用

Let’s Encrypt免费证书 很多浏览器并没有信任Let’s Encrypt根证书,因而它使用在IdenTrust根证书对它签名,IdenTrust已经嵌入大部分浏览器它只提供DV证书的签发,它支持SAN机制,可以包含100个主机名(域名和子域名) TLS协议分析 1.如何理解RFC文档

RFC文档是学习TLS/SSL最好的资料,前提是对密码学有一个了解

TLS学习资料,其中RFC 5246是最重要的 在这里插入图片描述 在这里插入图片描述

2.TLS/SSL协议概述

TLS/SSL分为握手协议和记录层协议

⑴握手协议

握手协议接近应用层,由四个子协议组成

握手协议★ 主要工作是协商出上方都任何的密码套件,基于密码套件协商出秘钥块告警协议 协商过程中产生了错误就使用告警协议应用层协议 主要是用来保护应用层协议数据,给应用层数据添加加密部分密码切换协议 密钥块准备好,可以进行加密了 ⑵记录层协议

记录协议在握手协议之下,会封装它的四个字协议,TLS记录层协议有固定的消息头格式 在这里插入图片描述

消息类型就是握手协议中的四个字协议版本号就是TLS/SSL版本号,目前一般是V1.2消息长度

它主要有四个处理步骤

数据分块,每个块固定大小长度压缩,一般不使用加密和完整性保护添加消息头 3.扩展

扩展就是在不更新TLS/SSL协议的基础上获得更多的能力,具体扩展相抵定义在RFC6066中

扩展的工作方式 客户端根据需求发送扩展,扩展列表消息包含在握手第一个请求消息中服务端返回可以支持的扩展 4.会话恢复

为了防止每次连接造成效率低下,TLS/SSL使用了会话恢复机制,在握手协议完成时,服务器端仍旧会保存会话信息

会话恢复要注意的地方 就算会话恢复,生成的密钥块还是和以前不一样,因为随机数变了会话没扩展信息,所以有扩展信息的时候要注意下! ⑴Session ID的工作原理 当客户端第二次请求相同网站时,如果存在对应的SessionID,请求时带着如果服务端能匹配带对应的会话,直接发送ChangeCipherSpec和Finished子消息,恢复连接,不进行密钥协商,因为主密钥存在于Session Cache中客户端发送回复表示会话恢复成功 ⑵SessionTicket的工作原理

使用SessionID的缺点

服务端存储,大型网站会占用很多服务端内存Session ID是基于底层Open SSL库的,所以不支持分布式SessionTicket解决了这些问题

SessionTicket的会话信息由客户端保存

简单过程:

对于一次新的连接

客户端在第一次请求包含一个空的SessionTicket TLS扩展服务端返回也会包括一个空的SessionTicket TLS扩展服务端对会话信息加密保护,发送一个New SessionTicket子消息,里面有一个票据给客户端

对于会话恢复

客户端发送票据服务端对票据解密校验,然后更新票据会话恢复

New SessionTicket

如果服务端Server Hell0消息包含一个SessionTicket TLS扩展,那么必须有它,否则不能发送它服务端校验客户端发送票据成功后,必须重新生成一个票据,然后通过它发送给客户端 HTTPS性能和安全 1.密码套件

理解TLS/SSL协议的核心是理解密码套件

2.安全性

关于安全性,可以多去阅读SSL Labs,RFC等网站,选择正确的密码套件等很重要

3.性能

首先,一个HTTPS网站性能差不应该归罪于TLS/SSL,这里重点讲解TLS/SSL优化

TLS/SSL性能可以从三个角度考虑

密码学算法,尽量选择性能更高的密码学算法协议软件

在TLS/SSL方面

尽量升级到性能更高的版本尽量使用TLS/SSL快速打开调整记录层协议长度HSTS可以提高性能会话恢复很重要检验证书吊销状态建议使用OCSP而不是CRL证书优化,中间证书间可能少,也不要包含根证书,最好使用ECC证书选择合适的密码套件和加密算法 等等 HTTPS网站实践 部署HTTPS网站的难点在于密码套件的配置,不过已经有了自动化工具可以帮助我们 1.工具化配置HTTPS SSL Configuration Generator 可以为各种服务器生成HTTPS协议配置Cloudflare推荐配置,另外Cloudflare的官方博客也不错 2.自动化测试HTTPS SSL Server TestSSL Client TestSSL Pluse 3.OpenSSL命令行工具

目前绝大部分浏览器仍旧使用OpenSSL库来实现TLS/SSL协议,使用命令行工具可以直接虚拟出来一个HTTPS网站

s_client工具,可以通过它调试SSL/TLS协议s_sever工具,可以通过它生成一个HTTPS协议的服务器 4.使用Ngnix + OpenSSL部署HTTPS网站 最好使用源代码编译的方式安装Nginx,主要可控性高,可以指定OpenSSL库版本,而不使用系统默认的OpenSSL库

基于nginx部署HTTPS网站,可以阅读下面的文档

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3