ssl-原理

元气小坏坏 提交于 2020-03-26 21:24:30

----------------------------------------------------SSL/TLS 介绍-----------------------------------------------------------------------------------
一: SSL/TLS 介绍
SSL 是安全套接层 (secure sockets layer),
TLS 是 SSL 的继任者,叫传输层安全 (transport layer security)。

在明文的上层和 TCP 层之间加上一层加密,这样就保证上层信息传输的安全。如 HTTP 协议是明文传输,加上 SSL 层之后,就有了雅称 HTTPS。它存在的唯一目的就是保证上层通讯安全的一套机制。
SSL协议实现的安全机制包括:

数据传输的机密性:利用对称密钥算法对传输的数据进行加密。

身份验证机制:基于证书利用数字签名方法对服务器和客户端进行身份验证,其中客户端的身份验证是可选的。

消息完整性验证:消息传输过程中使用MAC算法来检验消息的完整性。为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。

----------------------------------------------------SSL/TLS 版本------------------------------------------------------------------------------------
SSL1.0: 已废除
SSL2.0: RFC6176, 已废除
SSL3.0: RFC6101, 基本废除
TLS1.0: RFC2246, 目前大都采用此种方式
TLS1.1: RFC4346 TLS1.2: RFC5246, 没有广泛使用
TLS1.3: IETF 正在酝酿中

-----------------------------------------------------CA证书------------------------------------------------------------------------------------
CA: 证书授权中心 (certificate authority), 是证书的签发机构。 它呢,类似于国家出入境管理处一样,给别人颁发护照;也类似于国家工商管理局一样,给公司企业颁发营业执照。
它有两大主要性质:

CA 本身是受信任的 // 国际认可的
给他受信任的申请对象颁发证书 // 和办理护照一样,要确定你的合法身份,你不能是犯罪分子或造反派。
当然,你需要被收保护费,同时,CA 可以随时吊销你的证书。 证书长啥样?其实你的电脑中有一堆 CA 证书。

360 浏览器: 选项 / 设置 -> 高级设置 -> 隐私于安全 -> 管理 HTTPS/SSL * 证书 -> 证书颁发机构
火狐浏览器: 首选项 -> 高级 -> 证书 -> 查看证书 -> 证书机构
chrome 浏览器: 设置 -> 高级 -> 管理证书 -> 授权中心
ubuntu: /etc/ssl/certs

CA 的证书 ca.crt 和 SSL Server 的证书 server.crt 是什么关系呢?

SSL Server 自己生成一个 私钥 / 公钥对。server.key/server.pub // 私钥加密,公钥解密!
server.pub 生成一个请求文件 server.req. 请求文件中包含有 server 的一些信息,如域名 / 申请者 / 公钥等,即 Distinguish Name。
server 将请求文件 server.req 递交给 CA,CA 验明正身后,将用 ca.key 和请求文件计算摘要并加密生成 server.crt
由于 ca.key 和 ca.crt 是一对, 于是 ca.crt 可以解密 server.crt. 在实际应用中:如果 SSL Client 想要校验 SSL server. 那么 SSL server 必须要将他的证书 server.crt 传给 client. 然后 client 用 ca.crt 去校验 server.crt 的合法性。如果是一个钓鱼网站,那么 CA 是不会给他颁发合法 server.crt 证书的,这样 client 用 ca.crt 去校验,就会失败。
比如浏览器作为一个 client, 你想访问合法的淘宝网站 https://www.taobao.com, 结果不慎访问到 https://wwww.jiataobao.com , 那么浏览器将会检验到这个假淘宝钓鱼网站的非法性,提醒用户不要继续访问!这样就可以保证了 client 的所有 https 访问都是安全的。

-----------------------------------------------------证书内容------------------------------------------------------------------------------------
服务器证书包括以下几种信息:

证书的颁发者
证书的有效期
公钥
证书所有者(Subject)
签名所使用的算法
指纹以及指纹算法
◆Issuer (证书的发布机构)

指出是什么机构颁发的这个证书,也就是指明这个证书是哪个公司创建的(只是创建证书,不是指证书的使用者)。对于上面的这个证书来说,就是指"SecureTrust CA"这个机构。

◆Valid from , Valid to (证书的有效期)

也就是证书的有效时间,或者说证书的使用期限。 过了有效期限,证书就会作废,不能使用了。

◆Public key (公钥)

这个我们在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密的,第2章的例子中经常用到的。这个数字证书的公钥是2048位的,它的值可以在图的中间的那个对话框中看得到,是很长的一串数字。

◆Subject (使用者)

这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。 对于这里的证书来说,证书的所有者是Trustwave这个公司。

◆Signature algorithm (签名所使用的算法)

就是指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名。

◆Thumbprint, Thumbprint algorithm (指纹以及指纹算法)

这个是用来保证证书的完整性的,也就是说确保证书没有被修改过。 其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。 注意,这个指纹会使用"CA"证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一起。

-----------------------------------------------------证书签发认证过程------------------------------------------------------------------------------------
证书详细工作流

图一 证书签发认证过程

图二 ssl握手过程
1)申请认证:服务器需自己生成公钥私钥对 pub_svr & pri_svr,同时根据 pub_svr 生成请求文件 csr, 提交给 CA,csr 中含有公钥、组织信息、个人信息 (域名) 等信息。(图二中 server.req 就是 csr 请求文件)
2)审核信息:CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等。
3)签发证书:如信息审核通过,CA 会向申请者签发认证文件 - 证书。 证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。 签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名。(图二中生成 server.crt)
4)返回证书:client 如果请求验证服务器,服务器需返回证书文件。(图二中 handshake 传回 server.crt)
5)client 验证证书:client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法。客户端然后验证证书相关的域名信息、有效时间是否吊销等信息。 客户端会内置信任 CA 的证书信息 (包含公钥),如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。(图二中 check 可选,我们可以选择不验证服务器证书的有效性)
6)秘钥协商:验证通过后,Server 和 Client 将进行秘钥协商。接下来 Server 和 Client 会采用对称秘钥加密。(对称加密时间性能优)(图二中 pre-master/change_cipher_spec/encrypted_handshake_message 过程)
7)数据传输:Server 和 Client 采用对称秘钥加密解密数据。

----------------------------------------------------SSL/TLS 单向认证流程-----------------------------------------------------------------------------------

ssl握手过程

图三 ssl握手过程

(1)client_hello
客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:

<1>支持的最高 TSL 协议版本 version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本;

<2>客户端支持的加密套件 cipher suites 列表, 每个加密套件对应四个功能的组合:认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密) 和信息摘要 Mac(完整性校验);

<3>支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;

<4>随机数 random_C,用于后续的密钥的生成;

<5>扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。

(2)server_hello+server_certificate+sever_hello_done
server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的密钥协商;

server_certificates, 服务器端配置对应的证书链,用于身份验证与密钥交换;

server_hello_done,通知客户端 server_hello 信息发送结束;

(3)证书校验

客户端校验对方发过来的数字证书是否有效。

<1>首先在本地电脑寻找是否有这个服务器证书上的ca机构的根证书。如果有继续下一步,如果没有弹出警告。
<2>使用ca机构根证书的公钥对服务器证书的指纹和指纹算法进行解密。
<3>得到指纹算法之后,拿着这个指纹算法对服务器证书的摘要进行计算得到指纹。
<4>将计算出的指纹和从服务器证书中解密出的指纹对比看是否一样如果一样则通过认证。

[证书链] 的可信性 trusted certificate path;

证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同;

有效期 expiry date,证书是否在有效时间范围;

域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析;

(4)client_key_exchange+change_cipher_spec+encrypted_handshake_message
client_key_exchange,合法性验证通过之后

RSA算法
客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器;

此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商密钥; enc_key=Fuc(random_C, random_S, Pre-Master)
ECDHE算法
ECDHE的运算是把DHE中模幂运算替换成了点乘运算,速度更快,可逆更难。

流程如下:
(1):客户端随机生成随机值Ra,计算Pa(x, y) = Ra * Q(x, y),Q(x, y)为全世界公认的某个椭圆曲线算法的基点。将Pa(x, y)发送至服务器。

(2):服务器随机生成随机值Rb,计算Pb(x,y) = Rb * Q(x, y)。将Pb(x, y)发送至客户端。

(3):客户端计算Sa(x, y) = Ra * Pb(x, y);服务器计算Sb(x, y) = Rb *Pa(x, y)

(4):算法保证了Sa = Sb = S,提取其中的S的x向量作为密钥(预主密钥)。

change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信;

encrypted_handshake_message,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证;

(5)change_cipher_spec+encrypted_handshake_message
服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥: enc_key=Fuc(random_C, random_S, Pre-Master);

计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和密钥正确性;

change_cipher_spec, 验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信;

encrypted_handshake_message, 服务器也结合所有当前的通信参数信息生成一段数据并采用协商密钥 session secret 与算法加密并发送到客户端;

(6) 握手结束
客户端计算所有接收信息的 hash 值,并采用协商密钥解密 encrypted_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成;

(7) 加密通信
开始使用协商密钥与算法进行加密通信。
SSL加密通道上的数据加解密使用对称密钥算法,目前主要支持的算法有DES、3DES、AES等,这些算法都可以有效地防止交互数据被。


----------------------------------------------------SSL/TLS 协议-----------------------------------------------------------------------------------
SSL位于应用层和传输层之间,它可以为任何基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层:

上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)、SSL警告协议(SSL alert protocol);

底层为SSL记录协议(SSL record protocol)。

 

 

其中:

SSL握手协议:是SSL协议非常重要的组成部分,用来协商通信过程中使用的加密套件(加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥、实现服务器和客户端的身份验证。每个报文由类型,长度,内容三部分组成

 

 

1.类型(1字节),指SSL握手协议报文类型
2.字节(3字节),以字节为单位的报文长度
3.内容。使用报文有关的内容参数

SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。

SSL警告协议:用来向通信对端报告告警信息,消息中包含告警的严重级别和描述。

SSL记录协议:记录协议建立在可靠的传输协议之上,包括了记录头和记录数据格式的规定,为高层协议提供基本的安全服务,具体实施数据的封装,压缩/解压缩,加密/解密,计算和校验MAC等与安全有关的操作。

 

 

1.内容类型(8位)。用以说明封装的高层协议。已经定义的内容类型有:握手协议,修改密码协议,告警协议和应用数据协议
2.主要版本(8位)。SSL的主要版本
3.次要版本(8位)。SSL的次要版本
4.压缩长度(16位)。明文数据以字节为单位的长度,如果压缩则是压缩后的长度。

https://www.rfc-editor.org/rfc/rfc5280.txt 证书结构

reference:
https://www.jianshu.com/p/bad8a99de24c
https://www.cnblogs.com/dinglin1/p/9279831.html
https://www.iteye.com/blog/iluoxuan-1736275
https://www.cnblogs.com/goOtter/p/10255676.html

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!