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之间的关系:

企业私有CA体系架构图 企业私有CA体系架构 根CA 自签名 · 离线存储 中间CA 由根CA签发 · 在线服务 签名授权 终端证书 服务器/客户端 签发 CRL列表 定期更新 生成 OCSP响应器 实时查询 授权 客户端 验证证书状态 查询 说明:根CA离线存储,中间CA在线服务;CRL定期发布,OCSP实时查询;客户端优先使用OCSP,降级到CRL。

4.6 关键配置对比

组件 私钥强度 有效期 存储方式 更新频率
根CA 4096位 RSA 10-20年 离线、加密存储 几乎不更新
中间CA 4096位 RSA 5-10年 在线、加密存储 按需更新
OCSP响应器 2048位 RSA 1年 在线、明文存储 每年更新
终端证书 2048位 RSA/EC 1-2年 在线、明文存储 到期前更新