本文档会介绍如何用 cfssl 签发根证书(rootCA)、中间证书和叶子证书,以及通过 CRL 实现证书吊销列表。
示例目录结构:
.
├── ca.csr
├── ca-key.pem
├── ca.pem
├── client
│ └── main.go
├── config.json
├── crl.der
├── crl.pem
├── crl.txt
├── csr.json
├── go.mod
├── l2
│ ├── cert.csr
│ ├── cert-key.pem
│ ├── cert.pem
│ ├── csr.json
│ └── l3
│ ├── cert.csr
│ ├── cert-key.pem
│ ├── cert.pem
│ └── csr.json
├── main.go
├── README.md
└── server
└── main.go
最常见就是两种:
PEM(Privacy Enhanced Mail)
,通常用于数字证书认证机构(Certificate Authorities,CA)
,扩展名为.pem
, .crt
, .cer
, 和 .key
。内容为 Base64 编码的 ASCII 码文件,有类似 "-----BEGIN CERTIFICATE-----"
和 "-----END CERTIFICATE-----"
的头尾标记。服务器认证证书,中级认证证书和私钥都可以储存为 PEM 格式(认证证书其实就是公钥)。Apache 和 Nginx 等类似的服务器使用PEM格式证书。DER(Distinguished Encoding Rules)
二进制格式。扩展名为.der
,但也经常使用 .cer
用作扩展名,所有类型的认证证书和私钥都可以存储为 DER 格式。PEM 转换为 DER:
func pem2der(pemBytes []byte) (derBytes []byte) {
pemBlk, _ := pem.Decode(pemBytes)
return pemBlk.Bytes
}
每个参与方,无论是 CA 机构,还是最终的证书拥有者,都会有一个自行保管的随机生成的私钥。
任何人想要拥有一份证书时,需要用私钥生成一个证书请求文件(CSR),然后把 CSR 发送给一个 CA 机构,CA 机构用自己的私钥和证书,签发 CSR,得到一个新的证书,交给提交 CSR 的人。这个新的证书中,会包含 issuer 信息,即证明该证书是由哪一个 CA 签发的。若用户信任该 CA,也就信任了这个新证书。
go install github.com/cloudflare/cfssl/cmd/...@latest