第 4 章 自签名证书生成:openssl 命令详解、私钥、CSR、证书签发
说实话,在我刚入行那几年,最怕的就是跟证书打交道。每次搭建测试环境,光是找 CA 签名就要等半天。后来我悟了一个道理:自签名证书不是没用,而是你用得不够熟。开发联调、内网测试、设备初始配置,自签证书能把周期从几天缩到几分钟。今天我就把这套流程掰开揉碎了讲,保证你学完能闭着眼敲命令。
4.1 准备工作:先看看 openssl 在不在
别笑,我遇到过不止一次学员吭哧半天,最后发现机器上根本没装 openssl。先跑一句确认:
openssl version
输出类似 OpenSSL 1.1.1k 25 Mar 2021 就说明环境到位。如果提示命令未找到,Ubuntu/Debian 执行 sudo apt install openssl,CentOS/RHEL 执行 sudo yum install openssl。顺便说一句,我习惯在 /etc/ssl 下建一个工作目录,把所有证书相关文件放一起,方便后期维护。
4.2 生成私钥——RSA 还是 ECDSA?
私钥是整张证书的根基。你想想看,私钥泄露等于城门大开。openssl 支持多种算法,我平时主要用两种:
| 算法 | 推荐场景 | 生成命令 |
|---|---|---|
| RSA 2048 | 兼容性最好,几乎所有设备都认 | openssl genrsa -out server.key 2048 |
| ECDSA prime256v1 | 性能更优,证书体积小,现代浏览器都支持 | openssl ecparam -genkey -name prime256v1 -out server.key |
我个人习惯,如果对接老系统(比如 Windows Server 2012 以下),老老实实用 RSA。纯内部微服务集群,我偏爱 ECDSA,因为握手快。究竟选哪个?其实有个简单判断标准:你要签发给浏览器用,RSA 更稳;签给后端服务互调,ECDSA 更香。
chmod 600 server.key 解决问题。
4.3 创建 CSR——把你的身份写进去
CSR(Certificate Signing Request)本质上是一封信,里面装了你的公钥和身份信息。openssl 会拿私钥对这封信签名,证明“这公钥确实是我生成的”。为什么说这么做?因为 CSR 不包含私钥本身,只包含公钥和签名,所以传输给 CA 时不用担心私钥泄露。
生成 CSR 的标准命令:
openssl req -new -key server.key -out server.csr
执行后会让你填一堆字段。我直接列个表,你照着填:
| 字段 | 含义 | 示例(测试环境) |
|---|---|---|
| Country Name (2 letter code) | 国家代码 | CN |
| State or Province Name | 省/州 | Beijing |
| Locality Name | 城市 | Beijing |
| Organization Name | 公司名 | MyLab |
| Organizational Unit Name | 部门 | IT |
| Common Name | 域名或 IP | example.com |
| Email Address | 邮箱 | admin@example.com |
注意:Common Name(CN)是必填且最关键的一项。浏览器校验证书时,如果 CN 跟访问的域名不匹配,就会弹安全警告。
如果你不想交互式填写,可以一次性搞定:
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyLab/OU=IT/CN=example.com"
4.4 自签发证书——自己给自己当 CA
有了 CSR 和私钥,接下来就是用你自己的私钥给 CSR 签名,生成 X.509 证书。说白了,你同时扮演 CA 和证书申请者。命令如下:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
解释几个关键参数:
-days 365:有效期,生产环境一般别超过一年,测试环境我常用 3650 天(约 10 年)省事。-in server.csr:输入请求文件。-signkey server.key:用这个私钥签名——自签名就是这么来的。-out server.crt:输出证书文件。
命令执行完,server.crt 就是最终的自签名证书。你想想看,整个过程只有三行命令,比找 CA 机构快多了吧?
4.5 验证证书——别签完就不管了
我见过太多人签完证书直接部署,结果浏览器报错才发现 CN 写错了。养成习惯,签完立刻验证:
openssl x509 -in server.crt -text -noout
输出会显示证书版本、序列号、签名算法、有效期、Issuer(签发者)、Subject(主体)和公钥信息。重点检查两项:
- Issuer 和 Subject 是否一致——自签名证书下两者应该完全一样。
- Not Before 和 Not After 日期——别签了个过期证书还不自知。
如果还想看证书指纹和密钥用途,加个 -purpose:
openssl x509 -in server.crt -purpose -noout
4.6 知识流程总览
下面这张 SVG 流程图画了自签名证书的完整链路,你可以对照着把命令一步步走通:
4.7 关于文件格式,再说两句
你可能注意到我输出的文件名后缀是 .key、.csr、.crt。其实 openssl 默认全是 PEM 格式(Base64 编码,用 -----BEGIN ...----- 包裹)。如果某个平台要求 DER(二进制),加个 -outform DER 即可。嗯,这里要注意:绝大多数 Web 服务器和应用程序都认 PEM,所以除非对方明确要求,否则别乱改格式。