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:证书持有者信息。这里填的是你自己的组织信息。
关于 -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 核心逻辑流程图

下面这张图,把私钥生成、证书创建、内容查看的整个流程串起来了。你跟着箭头走一遍,心里就有谱了。

自签名根证书生成流程 自签名根证书生成与验证流程 步骤1:生成RSA私钥 openssl genrsa -out ca-key.pem 2048 步骤2:创建自签名根证书 openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=MyRootCA" 步骤3:查看证书内容 openssl x509 -in ca-cert.pem -text -noout 验证通过:根证书就绪 关键检查点:Subject = Issuer(自签名)、CA:TRUE、有效期、密钥长度2048+

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盘锁保险柜)
  • 只在需要签发子证书时才拿出来用
  • 用完立即从服务器上删除