如何使用自签 CA 签发服务器证书与客户端证书
如何使用自签 CA 签发服务器证书与客户端证书
在上一篇文章中,我们生成了一个自签的 CA 根证书:
my_ca.key
→ 根证书私钥(保密)my_ca.crt
→ 根证书公钥证书(可分发)
接下来,我们将用它来签发 服务器证书 和 客户端证书,这样内部系统就可以通过 TLS/SSL 或双向认证实现安全通信。
一、签发服务器证书
1. 生成服务器私钥
openssl genrsa -out server.key 2048
- 生成服务器私钥文件
server.key
。 - 这个私钥通常放在 Web 服务器(如 Nginx、Apache、Tomcat)上使用。
2. 生成服务器证书请求(CSR)
openssl req -new -key server.key -out server.csr \-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=Dev/CN=server.mycompany.com"
server.csr
是证书签名请求文件。CN
要填写服务器的域名,例如server.mycompany.com
。
3. 用 CA 签发服务器证书
openssl x509 -req -in server.csr -CA my_ca.crt -CAkey my_ca.key \-CAcreateserial -out server.crt -days 365 -sha256
参数说明:
-CA my_ca.crt
→ 指定根证书。-CAkey my_ca.key
→ 指定根证书私钥。-CAcreateserial
→ 自动生成my_ca.srl
文件(记录序列号)。-days 365
→ 有效期 1 年(作为懒人,还是先输入5年10年再说吧)。- 输出
server.crt
就是服务器证书。
4. 验证服务器证书
openssl verify -CAfile my_ca.crt server.crt
输出:
server.crt: OK
说明服务器证书是由我们自签 CA 正常签发的。
二、签发客户端证书
客户端证书常用于 双向 TLS 认证(Mutual TLS),比如 VPN、内部系统登录。
1. 生成客户端私钥
openssl genrsa -out client.key 2048
2. 生成客户端证书请求(CSR)
openssl req -new -key client.key -out client.csr \-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=client1"
CN=client1
表示客户端用户名或唯一标识。
3. 用 CA 签发客户端证书
openssl x509 -req -in client.csr -CA my_ca.crt -CAkey my_ca.key \-CAcreateserial -out client.crt -days 365 -sha256
4. 验证客户端证书
openssl verify -CAfile my_ca.crt client.crt
输出:
client.crt: OK
三、完整的文件清单
到这里我们有:
-
CA 文件
my_ca.key
→ 根 CA 私钥(保密)my_ca.crt
→ 根 CA 证书(分发给系统/客户端)
-
服务器文件
server.key
→ 服务器私钥server.csr
→ 服务器证书请求server.crt
→ 服务器证书
-
客户端文件
client.key
→ 客户端私钥client.csr
→ 客户端证书请求client.crt
→ 客户端证书
四、使用场景
-
单向认证(网站 HTTPS)
- 浏览器访问
server.mycompany.com
- 服务器返回
server.crt
- 浏览器检查
my_ca.crt
是否在信任列表,如果有,就认为可信。
- 浏览器访问
-
双向认证(VPN / 内部系统登录)
- 服务器验证客户端的
client.crt
是否由my_ca.crt
签发。 - 客户端验证服务器的
server.crt
是否由my_ca.crt
签发。 - 双方都通过 → 建立安全连接。
- 服务器验证客户端的
总结
通过前后两篇文章(如何自签CA根证书),我们完成了一个简易的 PKI 体系:
-
先生成自签根证书(CA)。
-
再用根证书签发 服务器证书 和 客户端证书。
-
在实际部署中:
- 把 CA 证书 (
my_ca.crt
) 导入到客户端的“受信任根证书存储区”。 - 服务器使用
server.key + server.crt
。 - 客户端使用
client.key + client.crt
。
- 把 CA 证书 (
这样就可以在内部系统中实现 HTTPS / 双向 TLS 认证。