HTTPS,SSL/TLS,数字证书
Last modified:2018-04-04
HTTPS
HTTPS:HyperText Transfer Protocol Secure
也可以理解为 HTTP over TLS 或者 HTTP over SSL,通过 HTTP 通信,利用 SSL/TLS 进行数据包加密,保护数据隐私与完整性。
严格说,HTTPS 不是单独协议,而是对工作在加密连接(TSL 或 SSL)上常规HTTP的称呼
开发 HTTPS 主要目的是为了提供对网站服务器的身份认证
vs HTTP
- HTTP URL 由 “http://” 开始,默认端口 80;HTTPS URL 由 “https://” 开始,默认端口 443
- HTTP不是安全的,攻击者可以通过监听和中间人攻击等手段,获取网站帐户和敏感信息等;HTTPS 的设计可以防止前述攻击,在正确配置时是安全的
TLS/SSL
- TLS:Transport Layer Security,前身 SSL:Secure Sockets Layer
- 是一种安全协议:为互联网通信提供安全及数据完整性保障
- 也是应用层协议,工作于 HTTP 之下,传输层之上
SSL -> TLS
- SSL 分为 1.0,2.0,3.0 三个版本,1.0 和 2.0 因存在严重安全漏洞被3.0 替代,其中 1.0 未公布过
- 3.0 1996 年发布,作为历史文献 IETF 通过 RFC 6101 发表
IETF:Internet Engineering Task Force,互联网工程任务组。是一个开放的标准组织,负责开发和推广自愿互联网标准,构成 TCP/IP 协议族(TCP/IP)的标准
- TLS 1.0,IETF 将 SSL 标准化,即 RFC 2246。技术上来说,TLS 1.0 和 SSL 3.0 差异微小,但足以排除两者之间的互操作性
- TLS 1.0 包括降级到 SSL 3.0 的实现,但这削弱了连接安全性
2014.10 Google 发布了在 SSL 3.0 中的设计缺陷,建议禁用,且公司相关产品中陆续禁止回溯兼容,强制使用TLS协议。Mozilla 11.25 也发布 FIREFOX 中彻底禁用 SSL 3.0。
TLS 发展
- 2006.4,TLS 1.1,RFC 4346
- 2008.8,TLS 1.2,RFC 5246
- 2018.8,TLS 1.3,RFC 8446
版本间的区别多为密码学相关内容,例如算法的替换,新增算法支持,不展开
TLS 基础握手
1. Client -> Server
- Client 发送
"ClientHello"
消息到 Server
ClientHello:
- TLS 最高协议版本,如 TLS 1.2
- 随机数,用于生成 "会话秘钥"
- 支持的加密套件列表,如 RSA,DH,DHE
- 支持的压缩算法
2. Server -> Client
- Server 发送
"ServerHello"
消息到 Client
ServerHello:
- 确定的协议版本 (选双方都支持的最高版本)
- 随机数
- 确定的加密套件
- 确定的压缩算法
- Server 发送
"Certificate"
消息,含 Server 证书 (含公钥 serverPublicKey),该步骤可能会由于加密套件的不同而被 Server 省略 - Server 发送
"ServerKeyExchange"
消息,该步骤可能会由于加密套件的不同而被 Server 省略,选择 DHE 和 DH_ANON 加密套件都会发送该消息 - Server 发送
" ServerHelloDone"
消息
3. Client -> Server
- Client 验证 Server 证书有效性
验证 Server 证书有效性:如果证书不是可信机构颁布,或者证书中的域名与实际域名不一致,或者证书已过期,访问者会被显示一个警告,选择是否还要继续通信
- Client 发送
"ClientKeyExchange"
消息,包含 PreMasterSecret ,公钥 clientPublicKey,或者什么也没有,取决于选中的加密套件。PreMasterSecret 会被 Server 证书里面的公钥加密过。 - Server 通过 serverPrivateKey 解密得 PreMasterSecret,Client 和 Server 使用之前的随机数和 PreMasterSecret 计算出 MasterSecret:MS,作为对称加密秘钥
- Client 发送
"ChangeCipherSpec"
记录,告诉 Server 从现在开始发送内容都会被验证(以及被加密)。
ChangeCipherSpec 其实已经是 TLS 记录层协议内容,Content type 字段值为 20 (0x14)
-
Client 发送一个被验证过且被加密过的
"Finish"
消息,包含了之前握手消息的 Hash 值和 Mac 值 -
Server 会解密 Clinet 的
"Finish"
信息,并验证 Hash 值和 Mac 值。如果解密或者验证失败,连接会结束。
4. Server -> Client
- Server 也会发出
"ChangeCipherSpec"
,告诉 Client 从现在开始发送内容都会被验证(以及被加密) - Server 发送它的被验证过且被加密过的
"Finish"
消息 - Client 进行和之前 Server 同样的解密和验证。
TLS 双向认证握手
1. 与基础握手一致
2. Server -> Client
"ServerHello"
"Certificate"
"ServerKeyExchange"
,该步骤可能会由于加密套件的不同而被 Server 省略,选择 DHE 和 DH_ANON 加密套件都会发送该消息- Server 发送
"CertificateRequest"
消息,请求 Client 的证书做双向认证 " ServerHelloDone"
3. Client -> Server
- Client 验证 Server 证书有效性
- Client 发送
"Certificate"
消息响应 Server 的证书请求,消息包含 Client 的证书 (包含 clientPublicKey) - Client 发送
"ClientKeyExchange"
消息,包含 PreMasterSecret,公钥 clientPublicKey,或者什么也没有,取决于选中的加密套件。PreMasterSecret 会被 Server 证书里面的公钥加密过。 - Client 发送
"CertificateVerify"
消息,这是使用 Client 证书私钥 clientPrivateKey 签名之前握手消息而得到的数字签名,Server 可以用 clientPublicKey 验签。验签让 Server 知道 Client 能访问其证书的权力以及拥有该证书 - Server 通过 serverPrivateKey 解密得 PreMasterSecret,Client 和 Server 使用之前的随机数和 PreMasterSecret 计算出 MasterSecret:MS,作为对称加密秘钥
"ChangeCipherSpec"
记录"Finish"
4. 与基础握手一致
握手过程知识点小结
握手过程中使用到了非对称加密(公钥-私钥对)
- Client 用 serverPublicKey 加密 PreMasterSecret,Server 用 serverPrivateKey 解密获得 PreMasterSecret
- Client 用其证书的 clientPrivateKey 签名之前发送的消息,Server 用 clientPublicKey 验签
- CA 证书有效性验证上也使用了非对称加密技术
对称加密会在之后传输数据时使用,密钥为握手过程产生的 MS。这也称为 TLS/SSL 的记录层 (Record Layouer)
这也突出了非对称加密和对称加密的特点:
- 非对称加密加密和解密花费时间较长,速度相对较慢,适合少量数据
- 对称加密反之,适合数据量大的情况
证书
证书,即数字证书,也叫身份证书,或者公开秘钥认证。是用来公开秘钥基础建设信息的电子文件,证明公开秘钥拥有者的身份。包含信息(X.509格式规范):
- 版本
- 序号
- 主体:国家,州/省,地域/城市,组织/单位,通用名称
- 数字证书认证机构,即数字证书发行者,一般为政府或者政府授权机构
- 有效期开始时间
- 有效期结束时间
- 公钥用途
- 公钥
- 公钥指纹 (会标注出明散列算法,如 SHA1,SHA256)
- 数字签名
- 主体别名
证书申领
- 申领人使用密码学产生一对密钥
- 保留私钥,公钥连同主体信息,使用目的等信息发送给认证机构 CA
- CA 核实身份(多渠道核实)
- 核实信任后,补充信息,如有效期,组成证书基本信息
- CA 用自己的私钥对申领人的公钥加上数字签名,生成证书
- 发送给申领人,或者公布
数字签名
数字签名在验证证书有效性上是一个非常重要的技术。而证书有效性的验证即身份认证。
简单的说,原文 –[散列算法,eg. sha1]–> 数字指纹 –[私钥加密:签名] –> 数字签名。验签:使用公钥解密得到数字指纹
严格的说,散列算法,也叫数字摘要技术,也叫 Hash, 并非数字签名必须的步骤,但是为了避免原文内容过长,加密效率低,因此通常原文会先 Hash 成短内容再签名,提高效率。
Hash 算法特点:相同内容 Hash 出来的密文 (指纹) 必然相同,不同内容 Hash 出来的密文 (指纹) 必然不同。
综上,证书有效性的验证:除去有效期,主体等明确内容的合法性判断
- 本地利用 CA 根证书进行验签(一般 CA 根证书本地都有),通过 CA 根证书的公钥能否解密来判断是否合法
- 解密成功,得到数字指纹,对比证书的数字指纹,对比证书的公钥进行Hash 后的数字指纹,判断是否被篡改
同理,对于握手期间 Client 签名之前发送过的内容并发送给 Server,然后 Server 的延签和 Hash 检查也是基于数字签名技术
证书类型
证书类型 | 简单说明 |
---|---|
自签证书 | 用于测试目的,无任何可信赖人签名,不被广泛信任,使用时会被软件警告 |
根证书 | 获得广泛认可,通常已预先安装在各种软件上(包括操作系统,浏览器,Email 软件等),信任链的起点,来自于公认可靠的政府机关和企业(如 Google)。有效期长,10 年以上。此外,还有企业内部网根证书,但是只用于企业内部 |
中介证书 | 认证机构给客户签发证书时候会先签发中介证书,再为客户做数字签署。有效期短,不同类别客户不同中介证书 |
授权证书 | 又叫属性证书,没有公钥,需依附于一张有效的数字证书上才有意义,赋予拥有人签发 “终端实体证书” 的权力。短期授予证书机构签发权力。 |
终端实体证书 | 不会用于签发其他证书,实际软件中部署,在创建加密通道时应用 |
TLS服务器证书 | 主体的通用名称为域名,组织或单位为机构名。证书(公钥)和私钥会安装在服务器上,等待客户端软件连接时协商加密细节。 |
通配符证书 | “服务器证书” 上主体的通用名称(或主体别名)一栏以通配符为前缀,该证书可用于旗下所有子域名 |
TLS客户端证书 | 不常见,因为考虑到技术门槛及成本因素,通常都是由服务提供者验证客户身份,而不是依赖第三方认证机构。需要使用到客户端证书的一般为企业内部网,亦或是金融领域对客户安全性要求较高的,如 U 盘(盾)内置证书 |