CFFLS安装和使用
简介CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
项目地址: https://github.com/cloudflare/cfssl
下载地址: https://pkg.cfssl.org/
CFSSL包括:
- 一组用于生成自定义 TLS PKI 的工具
cfssl
程序,是CFSSL的命令行工具multirootca
程序是可以使用多个签名密钥的证书颁发机构服务器mkbundle
程序用于构建证书池cfssljson
程序,从cfssl
和multirootca
程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘
PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:
- 证书所有组织的信息
- 公钥
- 证书颁发组织的信息
- 证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等
- 使用证书颁发组织私钥创建的数字签名
安装cfssl
这里我们只用到cfssl
工具和cfssljson
工具:
curl -s -L -o /bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o /bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
curl -s -L -o /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x /bin/cfssl*
cfssl命令介绍:
bundle
: 创建包含客户端证书的证书包genkey
: 生成一个key(私钥)和CSR(证书签名请求)scan
: 扫描主机问题revoke
: 吊销证书certinfo
: 输出给定证书的证书信息, 跟cfssl-certinfo 工具作用一样gencrl
: 生成新的证书吊销列表selfsign
: 生成一个新的自签名密钥和 签名证书print-defaults
: 打印默认配置,这个默认配置可以用作模板serve
: 启动一个HTTP API服务gencert
: 生成新的key(密钥)和签名证书- -ca:指明ca的证书
- -ca-key:指明ca的私钥文件
- -config:指明请求证书的json文件
- -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息
ocspdump
ocspsign
info
: 获取有关远程签名者的信息sign
: 签名一个客户端证书,通过给定的CA和CA密钥,和主机名ocsprefresh
ocspserve
集群相关证书类型
- client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
- server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
- peer certificate: 双向证书,用于etcd集群成员间通信
cfssl常用命令
使用CFSSL创建CA认证步骤
1、初始化json文件
[root@localhost ca]# cfssl print-defaults config > ca-config.json # 默认证书生产策略配置模板
[root@localhost ca]# cfssl print-defaults csr > ca-csr.json #默认csr请求模板
2、自签CA
修改ca-config.json文件:
- profiles:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;指定了不同角色的配置信息服务端使用server auth(TLS Web Server Authentication X509 V3 extension),客户端使用client auth(TLS Web Server Authentication X509 V3 extension)
- expiry:指定了证书的过期时间为175200小时(即20年)
内容如下:
{
"signing": {
"default": {
"expiry": "175200h"
},
"profiles": {
"server": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
自定义ca-csr.json,修改csr模板成如下内容:
{ "CN": "www.test.com", "hosts": [ "*.test.com", "www.test.net" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] }
说明:
- CN: Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法
- O: Organization Name,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group),组织名称,公司名称
- C: Country, 国家
- L: Locality,地区,城市
- OU: Organization Unit Name,组织单位名称,公司部门
- ST: State,州,省
3、生成CA证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@localhost ca]# ll
总用量 20
-rw-r--r-- 1 root root 830 4月 13 16:03 ca-config.json
-rw-r--r-- 1 root root 505 4月 13 16:05 ca.csr
-rw-r--r-- 1 root root 287 4月 13 15:58 ca-csr.json
-rw------- 1 root root 227 4月 13 16:05 ca-key.pem
-rw-r--r-- 1 root root 745 4月 13 16:05 ca.pem
生成ca.pem、ca.csr、ca-key.pem(CA私钥,需妥善保管)
4、生成server端证书
[root@localhost ca]# cfssl print-defaults csr > server-csr.json
[root@localhost ca]# cat server-csr.json
{
"CN": "example.net",
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
#修改server-csr.json内容如下:
[root@localhost ca]# cat server-csr.json
{
"CN": "server.test.com",
"hosts": [
"*.test.com",
"server.test.com"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
然后使用刚才生成的CA来给服务器签署证书,运行如下命令来生成服务端证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
同理,这里去生成客户端的证书