第 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 更香。

小提示:私钥文件权限务必设为 600。我曾经在客户现场排查过一起证书报错,查了半天发现是私钥权限 644 导致 Apache 进程无法读取——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域名或 IPexample.com
Email Address邮箱admin@example.com

注意:Common Name(CN)是必填且最关键的一项。浏览器校验证书时,如果 CN 跟访问的域名不匹配,就会弹安全警告。

避坑指南:我曾经在测试环境里把 CN 写成了 IP 地址,结果 Chrome 直接不认。最好给测试域名(比如 test.local)或者用 Subject Alternative Names(SAN),后面会讲。

如果你不想交互式填写,可以一次性搞定:

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(主体)和公钥信息。重点检查两项:

  1. Issuer 和 Subject 是否一致——自签名证书下两者应该完全一样。
  2. Not Before 和 Not After 日期——别签了个过期证书还不自知。

如果还想看证书指纹和密钥用途,加个 -purpose:

openssl x509 -in server.crt -purpose -noout

4.6 知识流程总览

下面这张 SVG 流程图画了自签名证书的完整链路,你可以对照着把命令一步步走通:

自签名证书生成流程图 自签名证书生成核心流程 生成私钥 openssl genrsa / ecparam 创建 CSR openssl req -new 自签发证书 openssl x509 -req -signkey 验证证书 openssl x509 -text -noout 输出:server.key (PEM) 输出:server.csr 输出:server.crt

4.7 关于文件格式,再说两句

你可能注意到我输出的文件名后缀是 .key、.csr、.crt。其实 openssl 默认全是 PEM 格式(Base64 编码,用 -----BEGIN ...----- 包裹)。如果某个平台要求 DER(二进制),加个 -outform DER 即可。嗯,这里要注意:绝大多数 Web 服务器和应用程序都认 PEM,所以除非对方明确要求,否则别乱改格式。

重要提醒:自签名证书不会被浏览器默认信任。生产环境务必使用公共 CA 签发的证书。自签证书只适合开发测试、内网管理、设备出厂配置等非公网场景。