4、根证书颁发机构(CA)搭建:生成根CA私钥、自签名根证书、配置CA策略文件

好,咱们正式开始动手搭建根CA。

这一步是整个信任链的基石。根CA一旦建好,它的私钥就是整个PKI体系里最敏感的东西。我见过不少团队,根CA搭得随意,结果后面所有子证书都得重来。所以这一章,咱们稳扎稳打。

4.1 根CA的目录结构设计

我个人习惯,先把目录结构理清楚。别小看这个,目录乱了你后面找文件会疯掉。

mkdir -p ~/myca/rootca
cd ~/myca/rootca
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial

解释一下每个目录的用途:

目录/文件 用途
certs/ 存放已签发的证书(根证书自己也会放一份)
crl/ 证书吊销列表存放位置
newcerts/ OpenSSL自动生成的证书副本
private/ 私钥存放,权限必须锁死
index.txt 证书数据库,记录所有已签发证书的状态
serial 下一个证书的序列号
注意:private/ 目录权限一定要设为 700。我曾经见过有人把私钥目录设成 755,结果被扫描工具扫出来,虽然没出事,但吓得我连夜改了所有权限。

4.2 生成根CA私钥

私钥是根CA的命根子。我建议用4096位RSA,虽然慢一点,但安全余量足。

openssl genrsa -aes256 -out private/ca.key.pem 4096
chmod 400 private/ca.key.pem

这里用了 -aes256,意思是私钥文件会被加密。每次使用私钥时都要输入密码。嗯,这里要注意:密码别搞太复杂,但也不能太简单。我一般用16位随机字符,记在密码管理器里。

为什么用4096位?2048位目前还安全,但考虑到根CA要用10年甚至更久,直接上4096省得以后升级。我在一个金融项目里吃过亏,他们一开始用2048,三年后合规要求升级,结果所有终端证书都得重新签发……那叫一个折腾。

4.3 配置CA策略文件

策略文件是OpenSSL的“剧本”。它告诉OpenSSL:证书该怎么签、有效期多长、哪些字段必须填。

我个人习惯把配置文件放在 ~/myca/rootca/openssl.cnf。下面是一个精简但完整的配置:

[ ca ]
default_ca = CA_default

[ CA_default ]
dir               = /home/user/myca/rootca
certs             = $dir/certs
crl_dir           = $dir/crl
new_certs_dir     = $dir/newcerts
database          = $dir/index.txt
serial            = $dir/serial
RANDFILE          = $dir/private/.rand

private_key       = $dir/private/ca.key.pem
certificate       = $dir/certs/ca.cert.pem

default_md        = sha256
preserve          = no
policy            = policy_strict

[ policy_strict ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
default_bits        = 4096
distinguished_name  = req_distinguished_name
string_mask         = utf8only
default_md          = sha256

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                      = Common Name
emailAddress                    = Email Address
关键点:policy_strict 里 countryName、stateOrProvinceName、organizationName 都设成了 match。这意味着下级证书的这几个字段必须和根CA一致。这是为了保持信任链的严格一致性。

你想想看,如果根CA是“China/Beijing/MyCompany”,下级证书突然变成“China/Shanghai/OtherCompany”,那信任链就断了。浏览器会报错。

4.4 自签名根证书

配置写好了,私钥也有了,接下来就是生成自签名根证书。自签名,说白了就是自己给自己当CA。

openssl req -config openssl.cnf \
      -key private/ca.key.pem \
      -new -x509 -days 7300 \
      -sha256 -extensions v3_ca \
      -out certs/ca.cert.pem

参数说明:

  • -x509:直接输出自签名证书,而不是证书签名请求(CSR)
  • -days 7300:有效期20年。根CA一般设10-20年
  • -extensions v3_ca:使用v3扩展,标记为CA证书

执行后会让你填一堆信息。我一般这样填:

字段 示例值 说明
Country Name CN 两字母国家代码
State or Province Beijing 不要缩写,写全称
Locality Name Beijing 城市名
Organization Name MyEdge Inc. 公司法定名称
Common Name MyEdge Root CA 必须能看出这是根CA
经验之谈:Common Name 里一定要带“Root CA”字样。我见过有人只写公司名,结果半年后自己都分不清哪个是根证书。命名规范点,后面省心。

4.5 验证根证书

证书生成完了,别急着用。先验证一下。

openssl x509 -in certs/ca.cert.pem -text -noout

重点看这几项:

  • Issuer 和 Subject 是否相同(自签名嘛,应该一样)
  • Validity 日期对不对
  • X509v3 Basic Constraints 是否显示 CA:TRUE
  • Signature Algorithm 是不是 sha256WithRSAEncryption

如果看到 CA:TRUE,说明这个证书有签发下级证书的权限。如果没有这一项,那它就是个普通证书,不能当CA用。

4.6 整体流程回顾

来,我把整个根CA搭建的流程画成一张图,方便你理解。

根CA搭建流程 1. 创建目录结构 mkdir, chmod, touch 2. 生成根CA私钥 genrsa -aes256 4096 3. 配置策略文件 openssl.cnf 4. 自签名根证书 req -x509 -days 7300 5. 验证根证书 x509 -text -noout 6. 根CA就绪 ca.cert.pem + ca.key.pem ⚠️ 关键提醒 • 私钥文件权限必须为 400,目录权限 700 • 根证书有效期建议 10-20 年,别设太短

4.7 安全注意事项

根CA的私钥一旦泄露,整个信任链就废了。我总结几条铁律:

  • 私钥离线存储:根CA的私钥最好放在离线机器上,平时不联网。签发下级CA时才通电
  • 密码强度:私钥密码至少16位,包含大小写字母、数字、特殊字符
  • 备份策略:私钥要备份,但必须加密存储。我一般用GPG加密后存到两个不同的物理位置
  • 定期审计:每半年检查一次根证书和私钥的状态,确保没被篡改
血的教训:我曾经在一个项目里,根CA的私钥密码写在了一个共享文档里。结果有个实习生不小心把文档发到了外部群……虽然及时撤回了,但那个周末我都在改密码和重新签发证书。从那以后,密码我只记在脑子里和密码管理器里。