CFSSL 是 CloudFlare 的 PKI/TLS 工具包。它既是一个命令行工具,也是一个 HTTP API 服务器,用于签署、验证和捆绑 TLS 证书。它需要 Go 1.16+ 才能构建。
请注意,某些 linux 发行版已删除某些算法(特别是基于 RHEL 的发行版),因此官方存储库中的 golang 将无法使用。这些发行版的用户应该 手动安装 go来安装 CFSSL。
CFSSL 包括:
cfssl
程序是使用 CFSSL 包的规范命令行实用程序。multirootca
程序是一个可以使用多个签名密钥的证书颁发机构服务器。mkbundle
程序用于构建证书池捆绑包。cfssljson
中获取 JSON 输出 ,并将证书、密钥、CSR 和捆绑包写入磁盘。cfssl
multirootca
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
构建 cfssl 需要 有效的 Go 1.16+ 安装。
$ git clone git@github.com:cloudflare/cfssl.git
$ cd cfssl
$ make
生成的二进制文件将位于 bin 文件夹中:
$ tree bin
bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca
0 directories, 8 files
您可以设置GOOS
和GOARCH
环境变量,让 Go 为其他平台进行交叉编译;但是,cfssl 需要 cgo,而 cgo 需要针对目标平台的有效编译器工具链。
安装需要有效的 Go 1.16+ 安装。或者,可以使用预构建的二进制文件
$ go get github.com/cloudflare/cfssl/cmd/cfssl
将下载、构建和安装 CFSSL 工具。
要安装此存储库中的任何其他实用程序(例如cfssljson
在本例中):
$ go get github.com/cloudflare/cfssl/cmd/cfssljson
这将下载、构建和安装 CFSSLJSON 工具。
并简单地安装此 repo 中的所有程序:
$ go get github.com/cloudflare/cfssl/cmd/...
如果你在 1.18 以上:
$ go install github.com/cloudflare/cfssl/cmd/...@latest
这将下载、构建和安装所有实用程序(包括cfssl
、cfssljson
等mkbundle
)。
命令cfssl
行工具使用命令来指定它应该执行的操作:
sign signs a certificate
bundle build a certificate bundle
genkey generate a private key and a certificate request
gencert generate a private key and a certificate
serve start the API server
version prints out the current version
selfsign generates a self-signed certificate
print-defaults print default configurations
用于cfssl [command] -help
查找有关命令的更多信息。该version
命令不带任何参数。
cfssl sign [-ca cert] [-ca-key key] [-hostname comma,separated,hostnames] csr [subject]
这csr
是客户端的证书请求。和标志分别-ca
是-ca-key
CA 的证书和私钥。默认情况下,它们是ca.pem
和ca_key.pem
。这-hostname
是一个逗号分隔的主机名列表,它会覆盖证书 SAN 扩展中的 DNS 名称和 IP 地址。例如,假设 CA 的私钥在 中 /etc/ssl/private/cfssl_key.pem
并且 CA 的证书在 中 ,为 cloudflare.com/etc/ssl/certs/cfssl.pem
签署证书:cloudflare.pem
cfssl sign -ca /etc/ssl/certs/cfssl.pem \
-ca-key /etc/ssl/private/cfssl_key.pem \
-hostname cloudflare.com \
./cloudflare.pem
也可以用标志指定 CSR -csr
。通过这样做,标志值优先并将覆盖参数。
主题是一个可选文件,其中包含应该用来代替来自 CSR 的信息的主题信息。它应该是一个 JSON 文件,如下所示:
{
"CN": "example.com",
"names": [
{
"C": "US",
"L": "San Francisco",
"O": "Internet Widgets, Inc.",
"OU": "WWW",
"ST": "California"
}
]
}
注意从 Go 1.7 开始,自签名证书将不包括 AKI。
cfssl bundle [-ca-bundle bundle] [-int-bundle bundle] \
[-metadata metadata_file] [-flavor bundle_flavor] \
-cert certificate_file [-key key_file]
这些捆绑包用于根证书池和中间证书池。此外,平台元数据通过-metadata
. 捆绑文件、元数据文件(和辅助文件)可以在以下位置找到:
https://github.com/cloudflare/cfssl_trust
-cert
通过和 分别指定 PEM 编码的客户端证书和密钥-key
。如果指定了密钥,将使用密钥构建并验证捆绑包。否则,将在没有私钥的情况下构建捆绑包。代替文件路径,用于-
从标准输入读取证书 PEM。证书文件应包含(部分)证书包也是可以接受的。
通过 指定捆绑风味-flavor
。共有三种风格: optimal
生成最短链和最高级密码算法的捆绑包,ubiquitous
生成跨不同浏览器和操作系统平台最广泛接受的捆绑包,以及 force
找到与输入证书文件内容相同的可接受捆绑包.
或者,可以直接从域中提取客户端证书。也可以通过 连接到远程地址-ip
。
cfssl bundle [-ca-bundle bundle] [-int-bundle bundle] \
[-metadata metadata_file] [-flavor bundle_flavor] \
-domain domain_name [-ip ip_address]
捆绑输出形式应遵循以下示例:
{
"bundle": "CERT_BUNDLE_IN_PEM",
"crt": "LEAF_CERT_IN_PEM",
"crl_support": true,
"expires": "2015-12-31T23:59:59Z",
"hostnames": ["example.com"],
"issuer": "ISSUER CERT SUBJECT",
"key": "KEY_IN_PEM",
"key_size": 2048,
"key_type": "2048-bit RSA",
"ocsp": ["http://ocsp.example-ca.com"],
"ocsp_support": true,
"root": "ROOT_CA_CERT_IN_PEM",
"signature": "SHA1WithRSA",
"subject": "LEAF CERT SUBJECT",
"status": {
"rebundled": false,
"expiring_SKIs": [],
"untrusted_root_stores": [],
"messages": [],
"code": 0
}
}
cfssl genkey csr.json
要生成私钥和相应的证书请求,请将密钥请求指定为 JSON 文件。该文件应遵循以下格式:
{
"hosts": [
"example.com",
"www.example.com",
"https://www.example.com",
"jdoe@example.com",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "San Francisco",
"O": "Internet Widgets, Inc.",
"OU": "WWW",
"ST": "California"
}
]
}
cfssl genkey -initca csr.json | cfssljson -bare ca
要生成自签名根 CA 证书,请将密钥请求指定为格式与“genkey”中相同的 JSON 文件。三个 PEM 编码的实体将出现在输出中:私钥、csr 和自签名证书。
cfssl gencert -remote=remote_server [-hostname=comma,separated,hostnames] csr.json
这会调用genkey
但有一个远程 CFSSL 服务器签名并颁发证书。您可以用来-hostname
覆盖证书 SAN。
cfssl gencert -ca cert -ca-key key [-hostname=comma,separated,hostnames] csr.json
这会通过 JSON 请求从本地 CA 生成并颁发证书和私钥。您可以用来-hostname
覆盖证书 SAN。
cfssl ocspsign -ca cert -responder key -responder-key key -cert cert \
| cfssljson -bare -stdout >> responses
这将为 生成 OCSP 响应cert
并将其添加到 responses
文件中。然后您可以传递responses
给以ocspserve
启动 OCSP 服务器。
CFSSL 自带一个基于 HTTP 的 API 服务器;端点记录在doc/api/intro.txt
. 服务器使用以下serve
命令启动:
cfssl serve [-address address] [-ca cert] [-ca-bundle bundle] \
[-ca-key key] [-int-bundle bundle] [-int-dir dir] [-port port] \
[-metadata file] [-remote remote_host] [-config config] \
[-responder cert] [-responder-key key] [-db-config db-config]
地址和端口默认为“127.0.0.1:8888”。和参数应该是 PEM 编码的证书和用于-ca
签名-ca-key
的私钥;默认情况下,它们是ca.pem
和ca_key.pem
。和 应该分别是用于根证书池和中间证书池的证书包-ca-bundle
。-int-bundle
这些分别默认为ca-bundle.crt
和int-bundle.crt
。如果 -remote
指定该选项,所有签名操作将被转发到远程 CFSSL。
-int-dir
指定中间目录。-metadata
是根证书存在的文件。该文件的内容是一个 json 字典 (k,v),因此每个密钥 k 都是根证书的 SHA-1 摘要,而值 v 是密钥存储文件名的列表。-config
指定配置文件的路径。-responder
和 -responder-key
分别是 OCSP 响应者的证书和私钥。
可以使用该选项控制日志记录的数量-loglevel
。这是在serve 命令之后:
cfssl serve -loglevel 2
级别是:
该cfssl
程序可以充当在线证书颁发机构,但它只使用一个密钥。如果需要多个签名密钥, multirootca
可以使用该程序。它只提供sign
, authsign
和info
端点。该文档包含配置和运行 CA 的说明。
mkbundle
用于构建用于验证证书的根和中间包。它可以安装
go get github.com/cloudflare/cfssl/cmd/mkbundle
它获取一组证书,检查 CRL 吊销(计划在下一个版本中支持 OCSP)和过期证书,并将它们捆绑到一个文件中。它采用证书目录和证书文件(可能包含多个证书)。例如,如果目录intermediates
包含许多中间证书:
mkbundle -f int-bundle.crt intermediates
将检查这些证书并将有效证书合并到一个 int-bundle.crt
文件中。
该-f
标志指定输出名称;-loglevel
指定日志记录的详细程度(使用与上面相同的日志级别),并-nw
控制撤销检查工作者的数量。
大多数输出cfssl
都是 JSON 格式。该实用程序可以根据需要将此cfssljson
输出拆分为单独的key
、certificate
、CSR
和 文件。bundle
该工具采用一个标志 ,-f
用于指定输入文件,以及一个参数,用于指定所生成文件的基本名称。如果输入文件名是-
(这是默认值),cfssljson 从标准输入读取。它通过以下方式将 JSON 文件中的键映射到文件名:
您可以将编码-stdout
后的内容传递到标准输出,而不是保存到文件中。
默认情况下,网络资产是根据它们的相对位置从磁盘访问的。如果您希望分发单个静态链接的cfssl
二进制文件,您需要在构建之前嵌入这些资源。这可以通过 go.rice工具来完成。
pushd cli/serve && rice embed-go && popd
然后构建go build
将使用嵌入式资源。
[/hidecontent]