CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL包含一个命令行工具和一个用于签名,验证并且捆绑TLS证书的 HTTP API服务。使用Go语言编写。
CFSSL包括:
- 1.一组用于生成自定义 TLS PKI 的工具
- 2.cfssl程序,是CFSSL的命令行工具
multirootca程序是可以使用多个签名密钥的证书颁发机构服务器
mkbundle程序用于构建证书池
cfssljson程序,从cfssl和multirootca程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘
PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:
- 1.证书所有组织的信息
- 2.公钥
- 3.证书颁发组织的信息
- 4.证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等
- 5.使用证书颁发组织私钥创建的数字签名
1.github
https://github.com/cloudflare/cfssl
2.下载
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64
chmod +x cfssl*
for x in cfssl*; do mv $x ${x%*_1.5.0_linux_amd64}; done
mv cfssl* /usr/bin
3.生成ca证书
- 1.建立集群CA keys与Certificates
- 2.创建认证中心(CA)
- 3.CFSSL可以创建一个获取和操作证书的内部认证中心。
- 4.运行认证中心需要一个CA证书和相应的CA私钥。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要
- 5.生成CA证书和私钥(root证书和私钥)
4.初始化
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json
- 默认生成的模板文件如下:
{
"signing": { //签名
"default": {
"expiry": "168h" //默认过期时间
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是etcd。
默认策略,指定了证书的有效期是一年(8760h)。
etcd策略,指定了证书的用途。
signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE。
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证。
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证。
{
"CN": "example.net", //标识具体的域
"hosts": [ //使用该证书的域名
"example.net",
"www.example.net"
],
"key": { //加密方式,一般RSA 2048
"algo": "ecdsa",
"size": 256
},
"names": [ //证书包含的信息,例如国家、地区等
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法
C: Country, 国家
L: Locality,地区,城市
O: Organization Name,组织名称,公司名称
OU: Organization Unit Name,组织单位名称,公司部门
ST: State,州,省
- 生成配置模板及证书信息
cat > ca-config.json <<EOF
{
"signing":{
"default":{
"expiry":"87600h"
},
"profiles":{
"kubernetes":{
"expiry":"87600h",
"usages":[
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF
{
"CN":"kubernetes",
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"Hebei",
"ST":"Zhangjiakou",
"O":"k8s",
"OU":"System"
}
]
}
EOF
5.使用证书信息文件生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
6.生成服务端的配置模板及证书信息
cat > server-csr.json << EOF
{
"CN":"kubernetes",
"hosts":[
"127.0.0.1",
"192.168.0.211",
"192.168.0.212",
"192.168.0.213",
"10.10.10.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluste.local"
],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"Hebei",
"ST":"Zhangjiakou",
"O":"k8s",
"OU":"System"
}
]
}
EOF
7.使用证书信息生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
8.集群管理员通过该证书访问集群
cat > admin-csr.json <<EOF
{
"CN":"admin",
"hosts":[],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"Hebei",
"ST":"Zhangjiakou",
"O":"system:masters",
"OU":"System"
}
]
}
EOF
9.生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
cat > kube-proxy-csr.json <<EOF
{
"CN":"system:kube-proxy",
"hosts":[],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"Hebei",
"ST":"Zhangjiakou",
"O":"k8s",
"OU":"System"
}
]
}
EOF
10.生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
参考链接:
https://www.linux78.com/index.php?title=Cfssl#github
https://kulong0105.cn/linux/2017/06/10/an-intorduction-about-cert