HTTPS协议及其相关

Posted by moloach on 2019-03-07

HTTPS = HTTP + 加密 + 认证 + 完整性保护

密码学

对称加密(Symmetric encryption)

通信双方使用同一密钥进行通信。

  1. 序列密码 将一字节的明文输入即可得到一字节的密文输出,一般针对无穷序列(RC4)
  2. 分组密码 每次加密一整块数据,例如128字节 需要填充有规律(AES)
    • 最后的字节指示填充的数据,解码的时候需要删除响应填充

散列函数(hash function) 摘要算法

将任意长度的输入转换为定长的输出的算法。 一般用于验证消息的完整性
特性:

  1. 单向性,无法得到原始输入
  2. 弱抗碰撞型, 一条信息只有一条散列
  3. 强抗碰撞型,计算上很难找到两条散列相同的消息

常见算法:

  1. SHA1 160位, 逐渐淘汰
  2. SHA256 变种等

消息验证代码(message authentication code MAC)

以身份验证扩展了散列函数的密码学函数,保证信息不被整体篡改
扩展:
基于散列的消息验证代码(hash-based message authentication code, HMAC)

分组密码模式

为了加密任意长度的数据,对分组密码的一种扩展。
ECB,CBC, CFB ,OFB ,CTR, GCM

  1. 电码本模式(electronic codebook ECB) 支持的数据长度刚好是块大小的整数倍,如果满足需要填充
    • 缺点:简单,很容易被攻击(TLS, BEAST)
  2. 加密块链模式(cipher block chaining, CBC) 为了解决ECB中确定性,引入了初始向量(initialization vertor IV),开始时随机生成一个初始IV进行加密,之后使用上一块的密文作为IV,以此类推!

非对称加密(asymmetric encryption)

针对多用户之间通信,对称加密显得繁碎且不安全,非对称加密使用一种,多用户共享公钥,服务器保有私钥的方法来解决这个问题。

Alice 使用公钥加密, Bob使用私钥解密, Bob使用私钥加密,Alice也可以使用公钥解密!

核心特性:公钥加密只能私钥解密,私钥加密可以用公钥解密

缺点:

1. 性能差,不适用数据量大的场景, HTTPS下使用RSA来协商对称私钥,然后使用对称算法来通信

常用算法:RSA

数据签名(digital signature)

用于验证一条电子消息或者一片电子文档的真实性。
流程:

  1. 计算签名文档的散列
  2. 对结果散列和额外的元数据进行编码
  3. 使用私钥加密编码数据,其结果就是签名,可以追加到文档中作为身份验证的数据
  4. 接受方使用公钥来验证文件的完整性

其他相关

随机数生成

分为真/假随机数生成器(true random/ pseudorandom number generator TRNG/PRNG)

密码衡量强度

ENISA提供了文档

####中间人攻击(man-in-the-middle, MITM)
被动网络攻击(passvie network attack)监听双方会话等
主动网络攻击(active network attack) 劫持流量(证书链解决的问题)

reference: 《HTTPS 权威指南》

协议

详细规范:RFC 5246 (TLS1.2)

记录协议(record protocol)

负责在传输连接上交换所有的底层消息,应用数据的对称加密传输,占据一个TLS连接的绝大多数流量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct {
   uint8 major;
   uint8 minor;
} ProtocolVersion;
enum {
   change_cipher_spec(20),
alert(21),
handshake(22),
   application_data(23), (255)
} ContentType;
struct {
   ContentType type;
   ProtocolVersion version;
   uint16 length;
   opaque fragment[TLSPlaintext.length];
} TLSPlaintext;

握手协议

reference: RFC 5246 rfc 6101

流程分为以下几类:

完整的握手 (full handshark)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Client                                               Server

ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data

Figure 1. Message flow for a full handshake
  1. 交换各自支持的功能,对需要连接的参数达成一致
  2. 验证初始的证书,或使用其他方式进行验证
  3. 对将用于保护会话的共享主密钥达成一致
  4. 验证握手消息未被第三方团体修改
ClientHello
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Handshake protocol: ClientHello
Version: TLS 1.2
Random
Client time: May 22, 2030 02:43:46 GMT
Random bytes: b76b0e61829557eb4c611adfd2d36eb232dc1332fe29802e321ee871
Session ID: (empty)
Cipher Suites
Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
Suite: TLS_RSA_WITH_AES_128_GCM_SHA256
Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA
Suite: TLS_RSA_WITH_AES_128_CBC_SHA
Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA
Suite: TLS_RSA_WITH_RC4_128_SHA
Compression methods
Method: null
Extensions
Extension: server_name
Hostname: www.feistyduck.com
Extension: renegotiation_info
Extension: elliptic_curves
Named curve: secp256r1
Named curve: secp384r1
Extension: signature_algorithms
Algorithm: sha1/rsa
Algorithm: sha256/rsa
Algorithm: sha1/ecdsa
Algorithm: sha256/ecdsa

客户端身份验证

只有经过身份验证的服务器才允许请求客户端身份验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Client                                               Server

ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data

Figure 1. Message flow for a full handshake

会话恢复

1
2
3
4
5
6
7
8
9
10
11
Client                                                Server

ClientHello -------->
ServerHello
[ChangeCipherSpec]
<-------- Finished
[ChangeCipherSpec]
Finished -------->
Application Data <-------> Application Data

Figure 2. Message flow for an abbreviated handshake

密钥交换

公钥基础设施

  • 订阅人
    订阅人(或者说最终实体)是指那些需要证书来提供安全服务的团体。
  • 登记机构
    登记机构(registration authority,RA)主要是完成一些证书签发的相关管理工作。例如,
    RA会首先对用户进行必要的身份验证,然后才会去找CA签发证书。在某些情况下,当CA希望在用户附近建立一个分支机构时(例如在不同的国家建立当地登记中心),我们也称RA为本地登记机构(local registration authority,LRA)。实际上,很多CA也执行RA
    的职责。
  • 证书颁发机构
    证书颁发机构(certification authority,CA)是指我们都信任的证书颁发机构,它会在确认申请用户的身份之后签发证书。同时CA会在线提供其所签发证书的最新吊销信息,这样信赖方就可以验证证书是否仍然有效。

  • 信赖方
    信赖方(relying party)是指那些证书使用者。技术上来说,一般是指那些执行证书验证的网页浏览器、其他程序以及操作系统。他们是通过维护根可信证书库来执行验证的,
    这些证书库包含某些CA的最终可信证书(信任密钥,trust anchor)。更广泛地说,信赖方是指那些需要通过证书在互联网上进行安全通信的最终用户。

证书类型

  1. Binrary(DER) certificate 包含原始格式的X.509证书,使用DER ASN.1编码
  2. ASCII(PEM) certificate 包含base64编码过的DER证书,以-----BEGIN CERTIFICATE----- 开头,以 -----ENDCERTIFICATE----- 结尾
  3. Binrary(DER) key 包含DER ASN.1编码之后的密钥的原始格式
  4. ASCII(PEM) key包括base64编码后的DER密钥和一些元数据信息
  5. PKCS#7 certificate 用于签名和加密数据的传输,一般以.p7b .p7c结尾
  6. PKCS#12 key and certificate 一种用来保存服务器私钥和整个证书链的复杂格式 一般以.p12和.pfx结尾

常用命令

1
2
3
4
5
6
7
8
#PEM 转 DER
openssl x509 -inform PEM -in fd.pem -outform DER -out fd.der

#DER 转 PEM
openssl x509 -inform DER -in fd.der -outform PEM -out fs.pem

# PKCS#12 <-----> pem
openssl pkcs12 -export -name "My certificate" -out fd.p12 -inkey fd.key -in fd.crt