什么是https
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层(如TCP)与应用层(如HTTP)之间对网络连接进行加密。
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL 层
https的基础是TLS,tls的基本原理是非对称加密,即加密的密钥和解密的密钥是不用的,称为公钥和私钥,使用公钥加密的内容只能使用私钥解密,反之亦然,使用私钥并不能解密私钥加密的内容
https连接建立过程分为两部分 一是身份验证部分(验证通信双方各自的身份),二是密钥协商部分(协商出一个双方都认可的对称密钥)
https的重点如下
客户端及服务器的有效性及真实性,确保没有第三方监听,通过CA机构及非对称加密保证
tls握手及密钥协商过程使用非对称加密,加强身份验证及防监听
由于非对称加密的性能极差,所以仅在握手阶段使用非对称加密
后续消息通过协商的密钥进行加密,防篡改和防监听
TCP连接建立流程
HTTPS单向认证
什么是HTTPS单向认证
https单向认证至客户端连接到某个域名或IP时,客户端需要验证服务器的身份,
服务器的身份一般通过证书的方式进行验证,服务器的证书一般都会在权威的CA机构进行签名,客户端收到服务器证书后,
会获取服务器证书对应的ca机构的证书,并用CA证书进行解密
身份认证过程
一般使用非对称加密算法做身份认证
RSA
DSA
ECDSA
密钥协商过程
有多种算法
RSA 通过非对称加密保证安全性
DH类算法 通过 "求解离散对数问题" 保证安全性 只能防监听,不能防篡改,所以一般会结合非对称加密算法(RSA,DSA,ECDSA)等做加密
ECDH类算法 通过 "椭圆曲线离散对数问题" 保证安全性 同上
DHE DH算法增强 E->ephemeral 指“临时密钥”(洋文是“ephemeral key”)即每个会话都选择新的密钥
ECDHE ECDH算法增强 同上
PSK 预共享密钥(一般用于内部部署,预置密钥在系统内部)
SRP Secure Remote Password,与psk类似,密钥换成了密码,还会有一些类似于加盐,随机数之类的机制
连接流程
ECDHE-RSA的连接及认证过程
身份认证
Client Hello 发送客户端支持的加密协议 及TLS版本 客户端随机数
sessionId和sessionTicket均可用于https会话恢复,区别在与sessionId对应的协商信息保存在服务器中,sessionTicket对应的协商信息保存在客户端中
客户端extension中携带session ticket信息表示客户端支持session ticket
关于扩展字段 pre_shared_key 和psk_key_exchange_modes,可以参考http://ddrv.cn/a/17072
本例中客户端不传递pre_shared_key指明客户端不使用PSK(预共享密钥模式,一般用在个人网络里面)
Sever Hello 发送服务器选择的加密协议及选择的TLS版本,服务器随机数
本例中使用的是ECDHE-RSA算法
Certificate 服务器发送自己的证书
密钥协商
Server Key Exchange 服务器发送协商对称密钥过程中的必要参数
DH类算法因为没有使用私钥进行计算,所以在末尾会使用私钥对报文本身进行签名,证明自己拥有私钥
Server Hello Done
指示 Server Hello完成
Client Key Exchange 客户端发送协商密钥过程中的必要参数(使用服务端证书中的公钥加密)
客户端收到服务器发送的必要参数,并使用自己的必要参数,计算出一个对称密钥
客户端必要参数发送给服务端后,服务端也能通过这些参数以及第5部中的参数计算出一样的对称密钥
Client change Cipher Spec
更改数据传输密钥通知,表示后续的请求都会使用协商好的对称密钥进行加密
Encrypted Handshake Message
使用对称密钥加密过后的握手消息,用来验证对称密钥是否工作
New Session Ticket
由于之前Client Hello及Server Hello都指明了可以使用Session Ticket,所以服务器下发了一个新的Session Ticket,下次客户端需要恢复回话时,可以省去协商密钥的过程
Server change Cipher Spec
更改数据传输密钥通知,表示后续的请求都会使用协商好的对称密钥进行加密
Encrypted Handshake Message
使用对称密钥加密过后的握手消息,用来验证对称密钥是否工作
HTTPS双向认证
https双向认证指除了客户端需要验证服务器之外,服务器也需要验证客户端
连接流程
步骤详解
双向认证过程中的大部分步骤是相同的,只是多了服务器请求客户端证书以及客户端发送证书及签名的过程
这里仅解释不同的部分
Server Certificate Request
服务器请求客户端证书用于验证客户端身份
Client Certificate
客户端发送自己的证书或证书链
Client Certificate Verify
与server key exchange一样,为了证明自己的身份,客户端需要使用私钥对之前的握手信息加密
服务器使用客户端证书公钥解密,如果一致的话才会通过验证
nginx中的配置
ssl_certificate /etc/nginx/cert2/server.crt; #服务器证书位置 ssl_certificate_key /etc/nginx/cert2/server.private;#服务器证书私钥文件位置 ssl_client_certificate /etc/nginx/cert2/ca.crt;#用于客户端证书校验的证书文件位置,意为客户端证书必须由此证书对应的ca机构签发 ssl_verify_client on;#是否开启客户端校验 ssl_verify_depth 2;#客户端校验深度,如果为1的话,代表客户端证书必须由顶级ca签发
附录
算法组合 | 密钥交换<360> | 身份认证 | 是否会遭遇中间人攻击 | 是否具备前向保密 | SSL 2.0 | SSL 3.0 | TLS 1.0 | TLS 1.1 | TLS 1.2 | TLS 1.3(草案) |
---|---|---|---|---|---|---|---|---|---|---|
RSA | RSA | RSA | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 否 |
DH-RSA | DH | RSA | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 否 |
DH-DSA | DH | DSA | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 否 |
DHE-RSA | DHE | RSA | 否 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
DHE-DSA | DHE | DSA | 否 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
ECDH-RSA | ECDH | RSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |
ECDH-ECDSA | ECDH | ECDSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |
ECDHE-RSA | DHE | RSA | 否 | 是 | 否 | 否 | 是 | 是 | 是 | 是 |
ECDHE-ECDSA | DHE | ECDSA | 否 | 是 | 否 | 否 | 是 | 是 | 是 | 是 |
PSK | PSK | PSK | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
PSK-RSA | PSK | RSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
DHE-PSK | DHE | PSK | 否 | 是 | 否 | 否 | 是 | 是 | 是 | ? |
ECDHE-PSK | DHE | PSK | 否 | 是 | 否 | 否 | 是 | 是 | 是 | ? |
SRP | SRP | SRP | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
SRP-RSA | SRP | RSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
SRP-DSA | SRP | DSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
DH-ANON | DH | 无 | 是 | 否 | 否 | 是 | 是 | 是 | 是 | 否 |
ECDH-ANON | ECDH | 无 | 是 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |
发表评论 取消回复