Synopsis

本文档会介绍如何用 cfssl 签发根证书(rootCA)、中间证书和叶子证书,以及通过 CRL 实现证书吊销列表。

x509-chain.drawio.png

示例目录结构:

.
├── 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

Background

证书编码格式

最常见就是两种:

PEM 转换为 DER:

func pem2der(pemBytes []byte) (derBytes []byte) {
	  pemBlk, _ := pem.Decode(pemBytes)
	  return pemBlk.Bytes
}

私钥、证书、CSR

每个参与方,无论是 CA 机构,还是最终的证书拥有者,都会有一个自行保管的随机生成的私钥。

任何人想要拥有一份证书时,需要用私钥生成一个证书请求文件(CSR),然后把 CSR 发送给一个 CA 机构,CA 机构用自己的私钥和证书,签发 CSR,得到一个新的证书,交给提交 CSR 的人。这个新的证书中,会包含 issuer 信息,即证明该证书是由哪一个 CA 签发的。若用户信任该 CA,也就信任了这个新证书。

Install

go install github.com/cloudflare/cfssl/cmd/...@latest

初始化配置