SSL(Secure Sockets Layer)证书,是用于加密互联网上数据传输的安全协议证书;用于保证在客户端和服务器之间传输的敏感数据不会被第三方窃取和篡改。
证书生成过程
1. 生成密钥对 (Private Key 和 Public Key)
- 私钥:用于加密和解密通信中的敏感数据,需要保密,仅存储在服务器上。
- 公钥:用于加密数据,公开,通常会嵌入到证书中,供客户端用来加密信息,服务器用私钥解密。
2. 生成证书签名请求 (CSR)
证书签名请求(CSR,Certificate Signing Request)是向证书颁发机构(CA)申请SSL证书的请求文件。CSR文件包含了公钥和一些关于组织的信息(如公司名称、域名、位置等),并用私钥进行了签名。CSR是SSL证书颁发的凭证。生成CSR时需要提供一些所需的基本信息。
3. 提交CSR到证书颁发机构 (CA)
CSR生成后,需要将其提交给受信任的证书颁发机构(CA,如 Symantec、DigiCert、Let's Encrypt等)。CA会验证身份,确保申请人对申请的域名有控制权(例如通过 DNS 验证或文件验证的方式)。
- 验证过程:CA 会进行一系列的验证来确认申请人的身份(例如,通过邮件、电话、或文档验证)。验证成功后,CA 会根据CSR 和验证信息生成SSL证书。
4. CA签发SSL证书
一旦CA验证通过,证书机构会签发一个正式的SSL证书。这个证书包含了申请人的公钥、CA的数字签名以及证书持有者的信息(如域名、CA信息、证书有效期等)。
证书文件通常有 .crt
或 .pem
等扩展名。
5. 配置服务器支持SSL/TLS
收到证书后需要将证书配置到需要使用https的Web服务器上,配置证书路径、私钥路径等相关信息。启用SSL/TLS加密,并确保服务器能够正确响应HTTPS请求。
Nginx配置示例:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/ssl_certificate.crt;
ssl_certificate_key /path/to/private.key;
}
最后通过访问网站的HTTPS来验证证书是否有效。
SSL证书作用流程
(1) 客户端发起请求
客户端明文发起请求,请求信息包括以下内容
- 支持的TSL协议版本:从低到高依次是SSLv2、SSLv3、TLSv1、TLSv1.1和TLSv1.2。
- 支持的加密套件: 每个加密套件包含认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要算法MAC(完整性校验)。
- 支持的压缩算法:用于后续信 息的压缩传输。
- 随机数:用于后续的密钥的生成。
- 扩展字段:支持协议与算法的相关参数以及其它辅助信息等,常见的Server Name Indication(SNI)就属于扩展字段。
(2) 服务端响应请求
- 服务端返回协商的信息结果,包括选择使用的协议版本(version)、选择的加密套件(cipher suite)、选择的压缩算法(compression method)、随机数(random_S)等,其中,随机数用于后续的密钥协商。
- 服务器端配置对应的证书链,来验证身份与交换密钥。
- 通知客户端信息发送结束。
(3) 客户端校验证书
客户端收到证书后,校验证书的合法性,合法则进行下一步通信,不合法则显示错误信息;校验内容如下:
- 校验证书链的可信性
- 证书是否吊销:离线 CRL(证书吊销列表)与在线 OCSP(在线证书列表)两类方式校验,不同的客户端行为不同。
- 有效期:证书是否在有效时间范围。
- 域名:核查证书域名是否与当前的访问域名匹配。
(4) 客户端密钥交换
- 客户端密钥交换:合法性验证通过之后,客户端计算产生随机数字Pre-master,并用证书公钥加密,发送给服务器。 此时,客户端已经获取全部的计算协商密钥需要的信息,即两个明文随机数(random_C和random_S) 以及自己计算产生的Pre-master,计算得到协商密钥enc_key=Fuc(random_C, random_S, Pre-Master)。
- 更改密码规范:客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。
- 加密的握手消息:结合之前所有通信参数的hash值与其它相关信息生成一段数据,采用协商密钥session secret与算法进行加密,然后发送给服务器用于数据与握手验证。
(5) 服务端改变密码规范
- 验证数据和密钥:收到被加密的数据后,用私钥解密,基于之前交换的两个明文随机数(random_C 和random_S),计算得到协商密钥enc_key=Fuc(random_C, random_S, Pre-Master)。通过计算之前所有接收信息的hash值,解密客户端发送的加密握手消息,验证数据和密钥正确性。
- 改变密码规范:验证通过之后,服务器同样发送改变后的密码规范以告知客户端后续的通信都采用协商的密钥与算法进行加密通信。
- 加密的握手消息:服务器结合所有当前的通信参数信息,生成一段数据,并采用协商密钥加密会话与算法加密并发送到客户端。
(6) 后续通讯
- 客户端计算所有接收信息的哈希值,并采用协商好的密钥解密,验证服务器发送的数据和密钥,验证通过则握
手完成。开始使用协商密钥与算法进行加密通信。
参考内容
SSL证书的原理
SSL证书原理讲解
数字证书原理
ChatGPT