cfssl 是 CloudFlare 使用golang开发的 pki/tls 瑞士军刀级开源工具。它既是一个命令行工具,也是一个用于签名、验证和捆绑 tls 证书的 http api 服务器。我们可以使用它方便快捷地生成tls通信所需要的私钥和证书。本文重点介绍使用cfssl和cfssl http api服务器生成证书的详细过程。
工具安装
cfssl官方仓库地址:
https://github.com/cloudflare/cfssl
可以在此下载到最新的源码,或者直接下载官方编译好的二进制文件,当前最新的版本为v1.6.5。
cfssl项目包含一系列工具:
$ tree bin
bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca
0 directories, 8 files
其中最常用的有以下这几个:
cfssl: 用于签发证书的标准命令行工具
cfssljson: 将cfssl生成的证书转变为文件
cfssl-certinfo: 验证和查看证书信息
cfssl 工具通过下面的命令指定需要执行的操作:
sign 签署证书
bundle 构建证书包
genkey 生成私钥和证书请求
gencert 生成私钥和证书
serve 启动HTTP API服务器
version 打印当前版本
selfsign 生成自签名证书
print-defaults 打印默认配置
生成证书
生成tls证书首先需要生成CA证书,CA证书分为根CA证书和中间CA证书,根CA证书通常用于签署其它中间证书,而中间证书则可以用于签署服务器所使用的TLS证书。当然,根证书也可以用来签名生成服务器证书,这里我们直接使用根证书进行签名。
在生成证书之前,需要创建一个证书请求配置文件,先来创建一个根证书的配置文件:ca-csr.json
{
"CN": "My Root CA",
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "example Inc",
"OU": "IT"
}
],
"ca": {
"expiry": "87600h"
}
}
在这个配置文件中,各项键值的含义如下:
CN(Common Name,通用名称)需要根据生成的证书类型来确定。对于服务器证书,一般填写该服务器的域名,对于CA证书,一般使用一个标识名称,例如 My Root CA,用以标识证书的颁发机构。
key则包含加密算法(algo)和密钥长度(size),一般使用rsa算法,在安全性要求比较高的场景,密钥长度可以设置为4096位。
names,包含多个字段,C指国家代号,ST指省份名称,L指城市或地区名称,O指组织或单位名称,OU指部门名称。
ca中的expiry指定CA证书的有效期,对于CA证书一般可以设置10年(87600小时))。
另外需要注意的是,由于json不支持注释,因此不能在这个配置文件中添加任何注释内容。
编辑好配置文件内容后,就可以使用如下的命令生成根CA证书了。命令最后的ca表示生成的文件将以此作为名称前缀。
cfssl gencert -initca ca-crs.json | cfssljson -bare ca
在生成服务器证书之前,可以为cfssl工具创建一个全局配置文件ca-config.json,通过它来定义不同使用场景的证书有效期,用途等。{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "8760h",
"usages": ["signing", "key encipherment", "server auth"]
},
"client": {
"expiry": "8760h",
"usages": ["signing", "key encipherment", "client auth"]
},
"peer": {
"expiry": "8760h",
"usages": ["signing", "key encipherment", "server auth", "client auth"]
},
"ca": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "server auth", "client auth"]
}
}
}
}
接下来,再创建一个服务器证书请求配置文件server.json,就可以生成服务器证书了。{
"CN": "*.example.com",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
"*.example.com",
"localhost",
"127.0.0.1"
]
}
需要注意的是,在服务器证书请求配置文件中,hosts列表中的值需要填写服务器的域名、泛域名,主机名和回环地址等,只有通过hosts中包含的域名、主机名或IP地址等方式访问该服务时才可通过认证。现在所有准备工作都已完成,可以使用CA证书来签名生成服务器证书了:cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
我们可以使用cfssl-certinfo工具来查看生成的证书信息.cfssl-certinfo -cert server.pem
通过API服务器生成证书
除了通过命令行工具生成tls证书,cfssl工具还支持启动一个http服务,通过API请求生成tls证书。
想要启动一个安全性高的API服务器,当然需要启用tls,相关的证书可以通过cfssl命令行生成,然后使用下面的命令启动:
cfssl serve -address 192.168.100.110 -port 8888 -ca ca.pem -ca-key ca-key.pem -tls-cert cfssl-server.pem -tls-key cfssl-server-key.pem -config ca-config.json
准备好证书请求配置文件后,就可以通过curl访问API服务器生成证书和私钥了。下面是一个生成CA证书和私钥的案例:
cat ca-csr.json | curl --cacert /opt/cfssl/cert/ca.pem -s -w "\n" -X POST -H "Content-Type: application/json" -d @- https://192.168.100.110:8888/api/v1/cfssl/init_ca | jq .result | cfssljson -bare ca
生成的证书文件会保存在执行命令的当前目录。
- END-
阅读原文:原文链接
该文章在 2025/8/25 13:19:19 编辑过