4、企业私有CA搭建实战:使用OpenSSL搭建根CA、中间CA的签发与管理、CRL与OCSP的配置
好,咱们进入实战环节。前面聊了那么多零信任和证书体系的理念,今天咱们亲手把根CA和中间CA搭起来。说实话,这部分内容我每次给团队培训时都会强调:私有CA是零信任证书体系的基石,搭不好后面全是坑。
我个人习惯用OpenSSL,它虽然命令行参数多,但胜在透明可控。你想想看,商业CA产品底层也是这些操作,只是给你包了个界面。咱们把底层搞懂了,以后用任何产品都不会慌。
本章核心目标:搭建一个两级CA体系(根CA + 中间CA),并配置CRL和OCSP服务,让客户端能验证证书是否被吊销。
4.1 根CA的搭建
根CA是整个信任链的起点。我在项目中见过不少团队直接把根CA当签发CA用,这是个大忌。根CA应该像保险柜里的印章,平时锁起来,只有做二级CA证书时才拿出来用一次。
先创建目录结构,我习惯这样组织:
mkdir -p ~/myCA/rootCA/{certs,crl,newcerts,private,requests}
cd ~/myCA/rootCA
touch index.txt
echo 1000 > serial
echo 1000 > crlnumber
解释一下这几个文件的作用:
- index.txt:证书数据库,记录所有已签发证书的状态
- serial:下一个证书的序列号,每次签发自动递增
- crlnumber:CRL的序列号,同样自动递增
接下来生成根CA的私钥和自签名证书。注意,根CA的私钥强度我建议至少4096位:
openssl genrsa -aes256 -out private/ca.key.pem 4096
chmod 400 private/ca.key.pem
openssl req -new -x509 -days 7300 -sha256 \
-key private/ca.key.pem \
-out certs/ca.cert.pem \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=MyCompany Root CA"
这里有个细节:-days 7300 是20年。根CA有效期长一些没关系,反正它不直接给终端设备用。但私钥密码一定要记牢,我曾经有个客户把根CA密码丢了,整个信任链重建,那叫一个痛苦。
4.2 中间CA的签发与管理
中间CA才是日常签发的主力。它由根CA签名,继承根CA的信任,但私钥独立管理。这样即使中间CA私钥泄露,只需要吊销它的证书,根CA还能继续用。
创建中间CA的目录结构:
mkdir -p ~/myCA/intermediateCA/{certs,crl,newcerts,private,requests,csr}
cd ~/myCA/intermediateCA
touch index.txt
echo 1000 > serial
echo 1000 > crlnumber
生成中间CA的私钥和证书签名请求(CSR):
openssl genrsa -aes256 -out private/intermediate.key.pem 4096
chmod 400 private/intermediate.key.pem
openssl req -new -sha256 \
-key private/intermediate.key.pem \
-out csr/intermediate.csr.pem \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=MyCompany Intermediate CA"
然后回到根CA目录,用根CA给中间CA的CSR签名。这里需要配置一个扩展文件,指定中间CA的用途:
# 文件: intermediate_ext.cnf
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
pathlen:0 表示中间CA下面不能再有CA了,只能签发终端证书。这个限制很重要,防止证书链无限延伸。
执行签名:
cd ~/myCA/rootCA
openssl ca -config openssl.cnf -extfile intermediate_ext.cnf \
-days 3650 -notext -md sha256 \
-in ../intermediateCA/csr/intermediate.csr.pem \
-out ../intermediateCA/certs/intermediate.cert.pem
签完后验证一下证书链:
openssl verify -CAfile certs/ca.cert.pem \
../intermediateCA/certs/intermediate.cert.pem
看到 intermediate.cert.pem: OK 就说明成功了。
我的经验:中间CA的目录和根CA一定要分开,最好放在不同服务器上。我在某金融客户那里部署时,根CA放在离线机器上,中间CA放在在线服务区,这样即使中间CA被攻破,根CA私钥也是安全的。
4.3 CRL的配置与发布
CRL(证书吊销列表)是证书被吊销后的黑名单。客户端拿到证书后,会去下载CRL检查证书是否还在有效期内。
配置CRL需要修改OpenSSL的主配置文件 openssl.cnf。关键参数如下:
[ CA_default ]
default_crl_days = 30
default_md = sha256
crlDistributionPoints = @crl_section
[ crl_section ]
URI.0 = http://crl.mycompany.com/root.crl
URI.1 = http://crl.mycompany.com/intermediate.crl
生成CRL的命令很简单:
# 根CA的CRL
cd ~/myCA/rootCA
openssl ca -gencrl -out crl/root.crl.pem
# 中间CA的CRL
cd ~/myCA/intermediateCA
openssl ca -gencrl -out crl/intermediate.crl.pem
查看CRL内容:
openssl crl -in crl/intermediate.crl.pem -text -noout
吊销证书时,需要指定证书的序列号:
openssl ca -revoke newcerts/1001.pem
吊销后记得重新生成CRL,否则客户端拿到的还是旧列表。
注意:CRL有个时效性问题。默认30天更新一次,但如果你吊销了证书,客户端可能还在用旧CRL,直到下次更新。对于高安全场景,我建议把CRL更新周期缩短到1天,甚至用OCSP替代。
4.4 OCSP的配置与部署
OCSP(在线证书状态协议)是CRL的升级版。它实时查询单个证书的状态,不用下载整个列表。说白了,CRL像报纸上的通缉令,OCSP像打电话问警察这个人是不是在逃。
配置OCSP需要先给OCSP响应器签发一个专用证书。这个证书由中间CA签发,用途标记为OCSP签名:
# 生成OCSP响应器私钥和CSR
openssl genrsa -out private/ocsp.key.pem 2048
openssl req -new -sha256 \
-key private/ocsp.key.pem \
-out csr/ocsp.csr.pem \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=OCSP Responder"
# 签发OCSP证书,需要扩展文件
# 文件: ocsp_ext.cnf
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning
签发:
openssl ca -config openssl.cnf -extfile ocsp_ext.cnf \
-days 365 -notext -md sha256 \
-in csr/ocsp.csr.pem \
-out certs/ocsp.cert.pem
启动OCSP响应器服务:
openssl ocsp -index index.txt \
-CA certs/intermediate.cert.pem \
-rkey private/ocsp.key.pem \
-rsigner certs/ocsp.cert.pem \
-port 8080 -text
客户端验证证书时,可以指定OCSP响应器地址:
openssl ocsp -issuer certs/intermediate.cert.pem \
-cert certs/server.cert.pem \
-url http://ocsp.mycompany.com:8080
返回 good 表示证书有效,revoked 表示已吊销。
避坑指南:我曾经在生产环境遇到过OCSP响应器证书过期导致所有客户端验证失败的事故。建议把OCSP证书有效期设短一些(比如1年),同时配置监控告警,提前30天提醒续期。
4.5 本章知识体系
下面这张图展示了根CA、中间CA、CRL和OCSP之间的关系:
4.6 关键配置对比
| 组件 | 私钥强度 | 有效期 | 存储方式 | 更新频率 |
|---|---|---|---|---|
| 根CA | 4096位 RSA | 10-20年 | 离线、加密存储 | 几乎不更新 |
| 中间CA | 4096位 RSA | 5-10年 | 在线、加密存储 | 按需更新 |
| OCSP响应器 | 2048位 RSA | 1年 | 在线、明文存储 | 每年更新 |
| 终端证书 | 2048位 RSA/EC | 1-2年 | 在线、明文存储 | 到期前更新 |