项目使用金融云部署,对外暴露IP访问,因安全合规要求必须使用域名访问,但公司又不提供域名。故,改为 https + 域名 + 客户端证书双向认证 访问模式,大大提升安全性。
1. 密钥文件类型
.key
、.csr
、.cer
(或 .crt
)和 .srl
是 SSL/TLS
证书管理中常见的文件类型。
1.1 .key 文件(私钥文件)
- 是什么?
- 这是一个私钥 文件。它通常使用非对称加密算法(如 RSA、ECC)生成,包含一个绝对不能公开的密钥对中的私密部分。
- 它可以是二进制的,但更常见的是 PEM 格式(文本格式,以
-----BEGIN PRIVATE KEY-----
开头,以-----END PRIVATE KEY-----
结尾)。
- 有什么作用?
- 身份验证:服务器用它来向客户端证明自己的身份。在 SSL/TLS 握手过程中,服务器会用私钥对一段数据进行签名,客户端用对应的公钥(在证书里)验证签名,从而确信正在与持有正确私钥的服务器通信。
- 加密:用于协商对称会话密钥。例如,在 RSA 密钥交换过程中,客户端会用证书中的公钥加密一个预主密钥并发送给服务器,只有持有私钥的服务器才能解密它。
- 生成 CSR : 创建证书签名请求(
.csr
)时必须使用相应的私钥。
1.2 .csr 文件(证书签名请求文件)
- 是什么?
- 这是一个证书签名请求文件。它是由申请者生成的,包含了希望包含在证书中的信息(如域名、组织、所在地等),以及最重要的:对应私钥的公钥。
- 它也是通常使用 PEM 格式(以
-----BEGIN CERTIFICATE REQUEST-----
开头)。
- 有什么作用?
- 申请证书: 将它提交给证书颁发机构(CA),请求 CA 为其签发一个数字证书。
- 信息载体: 包含了 CA 需要用来签发证书的所有信息。CSR 本身不包含私钥。
- 验证来源: CA 会验证 CSR 中的信息(尤其是域名所有权和组织信息)是否真实有效。
- 如何生成?
- 使用 OpenSSL 等工具,通过已有的私钥(
.key
文件)来生成。
- 使用 OpenSSL 等工具,通过已有的私钥(
1.3 .cer 或 .crt 文件(证书文件)
- 是什么?
- 这是数字证书文件。它是由证书颁发机构(CA)签发的,证明某个公钥属于某个特定的实体(如域名)。
- 它是基于你的
.csr
文件签发的,并附有 CA 的数字签名,使其可信。 - 常见格式有 PEM(文本格式,以
-----BEGIN CERTIFICATE-----
开头)和 DER(二进制格式)。扩展名.cer
和.crt
通常可以互换使用,都指证书。
- 有什么作用?
- 公钥分发: 证书的核心内容之一就是服务器的公钥。客户端(如浏览器)会获取这个证书来拿到可信的公钥。
- 身份证明: 证书包含了实体的身份信息(如域名),并由受信任的第三方(CA)背书。客户端通过验证证书的签名链,确信该证书是真实有效的。
- 建立安全连接: 在 HTTPS 等场景中,服务器将自己的证书发送给客户端,客户端验证通过后,便使用证书中的公钥来加密通信,与服务器建立安全的 TLS 连接。
- 与
.csr
的关系:.csr
是申请书(包含公钥和身份信息),.cer/.crt
是 CA 批准后颁发的正式身份证(包含公钥、身份信息和CA的签名)。
1.4 .srl 文件(序列号文件)
- 是什么?
- 这是一个序列号文件。它是由 CA(或自签名证书时的自己)生成和维护的一个简单的文本文件,里面包含一个十六进制的序列号。
- 有什么作用?
- 跟踪序列号: CA 为每个签发的证书分配一个唯一的序列号。每次签发新证书后,CA 会更新这个文件中的序列号,以确保下一个证书的序列号是唯一的。
- 主要用于自签名CA: 当你自己扮演 CA,使用 OpenSSL 为多个服务器或客户端签发证书时,这个文件非常重要。它可以避免为不同的证书签发相同的序列号。
- 首次生成证书时 ,OpenSSL 可能会创建一个包含初始序列号(如
00
)的.srl
文件。之后签发证书时会自动递增并使用它。
1.5 工作流程
1.5.1 CA颁发
生成 使用私钥创建 发送给 验证并签发 返回给 生成并维护 确保唯一性 泄露后果 申请者 密钥对 (.key) 证书签名请求 (.csr) 证书颁发机构 (CA) 数字证书 (.cer/.crt) CA 序列号文件 (.srl) ⚠️ 安全警告
私钥必须严格保密 身份冒充、中间人攻击
- 服务端:生成私钥(.key)→ 使用私钥生成证书签名请求(.csr)→ 将 .csr 文件提交给 CA → CA验证和签发,生成数字证书(.cer/.crt)→ 将私钥(.key)和 数字证书(.cer/.crt)配置在服务器(如 Nginx, Apache)上。
- 客户端:当客户端(浏览器)访问,服务器下发证书,客户端验证安装证书。
1.5.2 自签名颁发
自签名签发
相当于你自己扮演一个证书颁发机构(CA),为自己的服务器或客户端签发证书。一般应用场景:
- 内部网络:公司内部服务器、开发测试环境、物联网设备。
- 开发测试:在本地开发HTTPS应用。
- 学习目的:理解PKI的工作原理。
⚠️重要警告⚠️:自签名CA颁发的证书在互联网上不会被公众信任的浏览器和操作系统默认信任。除非用户手动安装并信任你的根CA证书,否则会看到安全警告。
整个流程的核心是两级证书结构:
- 生成根CA :创建一个根证书和私钥,这是所有信任的起点。
- 用根CA签发服务器证书:使用根CA的私钥为你的服务器签发最终使用的证书。
大致流程图:
生成根CA密钥
ca.key 生成根CA证书
ca.crt 生成服务器密钥
server.key 创建服务器CSR
server.csr 用根CA签发服务器证书
server.crt 客户端 安装并信任ca.crt 访问服务器时验证server.crt 成功建立安全连接