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 |
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搭建的流程画成一张图,方便你理解。
4.7 安全注意事项
根CA的私钥一旦泄露,整个信任链就废了。我总结几条铁律:
- 私钥离线存储:根CA的私钥最好放在离线机器上,平时不联网。签发下级CA时才通电
- 密码强度:私钥密码至少16位,包含大小写字母、数字、特殊字符
- 备份策略:私钥要备份,但必须加密存储。我一般用GPG加密后存到两个不同的物理位置
- 定期审计:每半年检查一次根证书和私钥的状态,确保没被篡改