一、cfssl概述
CFSSL是CloudFlare公司提供的PKI/TLS工具,使用Go语言开发。开源并支持Windows、Linux、macos系统。
源码: https://github.com/cloudflare/cfssl
- 工具集:
- multirootca:管理多个签名密钥的情形;使用多个签名密钥的证书颁发机构服务器
- mkbundle:构建证书池;
- cfssljson:将从cfssl和multirootca等获得的json格式的输出转化为证书格式的文件(证书,密钥,CSR和bundle)进行存储;
- cfssl-certinfo:可显示CSR或证书文件的详细信息;可用于证书校验。
- 文件说明
ca-config.json:配置文件
ca-csr.json:证书请求文件
han-ca.csr:证书签名请求文件
han-ca.pem:公钥
han-key.pem:私钥
ca-config.json解析
可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
- signing:签署,表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
expiry:证书有效期限(单位:小时),8760h=1年;指定了证书的过期时间。
usage:用法;
key encipherment:密钥加密;
profiles:指定了不同角色的配置信息;可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile。
server auth:服务器身份验证;表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:客户端身份验证;表示 server 可以用该 CA 对 client 提供的证书进行验证;
ca-csr.json解析
{
"CN": "example.net",
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "rsa",
"size": 204
},
"names": [
{
"C": "US",
"ST": "CA",
"L": "San Francisco"
“O“:”kubernetes”
“OU”:”system”
}
]
}
CN: Common Name
hosts:包含的授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误。kubernetes 开头的域名作用:集群创建好后,default namespace 下会创建一个叫 kubenretes 的 svc,有一些组件会直接连接这个 svc 来跟 api 通讯的,证书如果不包含可能会出现无法连接的情况;
Key: 指定使用的加mi算法,一般使用rsa非对称加mi算法(algo:rsa;size:)。“CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
.csr文件解析
CA机构不会凭空创建一个证书,他们需要一个公钥和一些元数据来填入证书之中,而这些信息就是存放在CSR文件之中,
Csr文件需要包含:
申请者的公钥信息
使用申请者私钥产生的数字签名
申请者机构相关的信息
二、命令语法格式
使用 cfssl --help
可以看见 cfssl 工具的相关命令。
version # 查看 cfssl 版本
selfsign # 生成一个新的自签名密钥和签名证书
certinfo # 输出给定证书的证书信息, 跟 cfssl-certinfo 工具作用一样
print-defaults # 打印json格式的模板-ca签名配置文件和客户端证书请求文件
# config:生成ca配置模板文件
# csr:生成证书请求模板文件
gencert # 生成新的key(密钥)和签名证书
# -initca:初始化一个新ca (默认false,需要指定ca证书用以前面其他证书)
# -ca:ca的证书
# -ca-key:ca的私钥文件
# -config:请求证书的json文件
# -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息
sign # 签名一个客户端证书,通过给定的CA和CA密钥,和主机名
revoke # 吊销证书
info # 获取签名者信息
bundle # 创建包含客户端证书的证书包
serve # 启动一个HTTP API服务
genkey # 生成一个key(私钥)和csr(证书签名请求)
gencsr # 生成新的证书请求文件
gencrl # 生成新的证书吊销列表
1. cfssl selfsign
用于生成一个自签名证书,即自己颁发给自己的证书。
提示自签名证书很危险,使用此自签名证书风险自负,强烈建议不要使用这些证书在生产中。
# 1. 生成证书请求文件
cat > server-csr.json<<EOF
{
"CN":"www.amjun.com",
"hosts":[
"127.0.0.1",
"192.168.1.1",
"amjun.com",
"www.amjun.com"
],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"OU":"iot",
"O":"unipower",
"ST":"GuangZhou",
"L":"GuangDong",
"C":"CN"
}
]
}
EOF
# 2. 生成私钥和证书
# 使用方式 cfssl selfsign HOSTNAME CSRJSON
cfssl selfsign www.amjun.com server-csr.json | cfssljson -bare server
# docker方式:
docker run --rm -v $PWD:/workdir cfssl/cfssl selfsign www.amjun.com server-csr.json | cfssljson -bare server
# 3. 查看证书
cfssl certinfo -cert server.pem
2. cfssl gencert
使用证书请求文件生成证书。
2.1 生成 CA 证书
与自签名证书类似,生成 CA 证书也需要证书请求文件。
# 1. 生成证书请求文件
cat > ca-csr.json <<EOF
{
"CN":"kubernetes",
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"Hebei",
"ST":"Zhangjiakou",
"O":"k8s",
"OU":"System"
}
]
}
EOF
# 2. 生成证书
# -initca 指定这个生成 ca 证书,否则需要指定 ca 证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# docker方式:
docker run --rm -v $PWD:/workdir cfssl/cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2.2 生成 CA 签名的证书
# 1. 生成证书配置文件(CA 进行签名时需要的配置)
cat > ca-config.json <<EOF
{
"signing":{
"default":{
"expiry":"87600h"
},
"profiles":{
"kubernetes":{
"expiry":"87600h",
"usages":[
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
# 这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是etcd。
# 默认策略,指定了证书的有效期是一年(8760h)
# etcd策略,指定了证书的用途
# signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
# server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证
# client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
# 2. 生成服务端证书请求文件
cat > server-csr.json <<EOF
{
"CN":"server",
"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
# 3. 基于之前生成的ca证书生成证书
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
server-csr.json | cfssljson -bare server
# docker方式:
docker run --rm -v $PWD:/workdir cfssl/cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
# 3. 查看证书
cfssl certinfo -cert server.pem
常用的就上面两个命令,基本满足日常使用
下面讲讲其他的命令,有部分是前面的命令的其中一步。比如,下面cfssl genkey
就是只生成 key 文件和证书请求文件,并不会生成证书。
3. cfssl genkey
# 1. 生成证书配置文件
cat > ca-config.json <<EOF
{
"signing":{
"default":{
"expiry":"87600h"
},
"profiles":{
"kubernetes":{
"expiry":"87600h",
"usages":[
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
# 2. 生成密钥文件
cfssl genkey ca-config.json | cfssljson -bare ca