3、自签名根证书:生成RSA私钥、创建自签名根证书、查看证书内容
好,咱们进入实操环节。这一章要干的事,说白了就是给自己当一回CA——自己给自己签一张根证书。你可能会问:“为啥不直接用现成的?”嗯,在内部测试环境、开发网络或者设备管理场景里,自签名根证书是最快、最可控的方式。我这些年折腾过的项目,十有八九都是从这一步开始的。
3.1 生成RSA私钥——证书的“命根子”
私钥是什么?它就是证书的身份证加保险柜钥匙。丢了它,别人就能冒充你;泄露了,整个信任链就崩了。所以,生成私钥这一步,马虎不得。
我个人习惯用 OpenSSL 来干这活。它几乎是Linux和macOS的标配,Windows下也能装。命令很简单,但参数有讲究。
openssl genrsa -out ca-key.pem 2048
这条命令干了三件事:
- genrsa:告诉OpenSSL,我要生成RSA密钥。
- -out ca-key.pem:把私钥存到
ca-key.pem文件里。 - 2048:密钥长度。单位是bit。
- 2048位:当前主流,安全够用,性能均衡。我99%的项目都用它。
- 4096位:更安全,但生成慢、握手也慢。除非客户有合规硬性要求,否则没必要。
- 1024位:别用了。2015年后就被认为不安全了。
执行完,你会得到一个文件。你可以用文本编辑器打开看看——里面是Base64编码的乱码,头尾有 -----BEGIN RSA PRIVATE KEY----- 和 -----END RSA PRIVATE KEY----- 标记。这就是你的私钥。
我曾经见过一个同事,把私钥文件权限设成 644,结果被其他进程读走了,整个CA信任链被迫重建。记住:
- Linux/macOS:
chmod 400 ca-key.pem(只有所有者可读) - Windows:右键属性 → 安全 → 只保留管理员完全控制
- 最好把私钥离线存储,用的时候再拷回来
3.2 创建自签名根证书——给自己发“身份证”
私钥有了,接下来就是用这把“钥匙”给自己签发一张证书。这张证书就是你的根证书,是整个信任链的起点。
命令长一点,但别怕,我拆开讲:
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyLab/OU=Dev/CN=MyRootCA"
参数逐个看:
- req:证书请求和生成工具。
- -new:生成一个新的证书请求(虽然这里直接自签名了)。
- -x509:直接输出自签名证书,而不是证书请求文件。这是关键。
- -days 3650:有效期10年。根证书一般设长一点,省得频繁换。
- -key ca-key.pem:指定刚才生成的私钥。
- -out ca-cert.pem:输出的证书文件。
- -subj:证书持有者信息。这里填的是你自己的组织信息。
| 字段 | 含义 | 示例 |
|---|---|---|
| C | 国家代码 | CN(中国) |
| ST | 省份/州 | Beijing |
| L | 城市 | Beijing |
| O | 组织名称 | MyLab |
| OU | 部门 | Dev |
| CN | 通用名称(最重要) | MyRootCA |
注意:CN 对于根证书来说,就是它的“名字”。别人信任它时,就是通过这个名字来识别的。
执行完,你会得到 ca-cert.pem。这就是你的自签名根证书。你可以用 cat 看看,它也是Base64编码,但头尾是 -----BEGIN CERTIFICATE-----。
3.3 查看证书内容——验证你干了什么
证书生成完了,怎么确认里面信息都对?用这条命令:
openssl x509 -in ca-cert.pem -text -noout
输出会很长,我挑几个重点部分说说:
- Certificate: 数据块开始。
- Subject: 就是你在
-subj里填的信息。检查一下CN对不对。 - Issuer: 签发者。因为是自签名,所以 Issuer 和 Subject 一模一样。
- Validity: 有效期。确认起止时间对不对,尤其是
Not Before和Not After。 - Subject Public Key Info: 公钥信息。能看到算法是 RSA,长度是 2048 位。
- Signature Algorithm: 签名算法。默认是 sha256WithRSAEncryption,没问题。
- X509v3 extensions: 扩展字段。根证书里会有
CA:TRUE,表示它可以用来签发其他证书。
我只想看关键信息,可以用这条:
openssl x509 -in ca-cert.pem -subject -issuer -dates -noout
输出简洁明了,一眼就能看到 Subject、Issuer 和有效期。我在排查问题时经常用这个。
3.4 核心逻辑流程图
下面这张图,把私钥生成、证书创建、内容查看的整个流程串起来了。你跟着箭头走一遍,心里就有谱了。
3.5 避坑指南——我踩过的雷
做了这么多年,有些坑是新人必踩的。我挑几个最常见的说说:
- 私钥密码忘了设? 上面的命令生成的私钥是没密码保护的。如果有人拿到文件,直接就能用。我建议生成时加上
-aes256参数,比如openssl genrsa -aes256 -out ca-key.pem 2048,这样每次用私钥都要输密码。 - CN 填错了? 根证书的 CN 一旦生成就不能改。如果填错了,只能重新生成。我曾经有个项目,CN 里多了个空格,排查了半天才发现。
- 有效期设太短? 根证书一般5-10年。设1年的话,每年都要重新部署到所有设备上,运维成本很高。
- 证书和私钥搞混? 记住:
.pem只是后缀,内容看头标记。私钥头是BEGIN RSA PRIVATE KEY,证书头是BEGIN CERTIFICATE。
自签名根证书一旦生成,它的私钥就是整个信任链的“根密钥”。如果这个私钥泄露了,所有由它签发的证书都不再可信。所以:
- 生产环境的根证书私钥,建议离线存储(比如U盘锁保险柜)
- 只在需要签发子证书时才拿出来用
- 用完立即从服务器上删除