测试操作主机 172.10.10.200
证书环境
证书工具
- openssl
- cfssl(本节主角)
cfssl 工具
- cfssl
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
cp cfssl_linux-amd64 /usr/bin/cfssl
- cfssljson
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
cp cfssljson_linux-amd64 /usr/bin/cfssljson
- cfssl-certinfo
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
cp cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
记得授执行权限哦
chmod +x /usr/bin/cfssl*
制作CA证书
CA证书的作用,用于后续k8s中的组件交互所需各种证书的签发
CA证书是根证书,权威证书,用于签发其他证书
1. 创建生成CA证书签名请求(csr)的JSON配置文件
技巧:cfssl print-defaults csr
能够打印csr文件模板作参考
vim /opt/certs/ca-csr.json
{
"CN": "HzwOrg",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"name": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "hzw",
"OU": "hzwself"
}
],
"ca": {
"expiry": "175200h"
}
}
说明:
- hosts: 使用证书的主机列表 ??
- CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。
- C:Contry,国家
- ST:State,省、州
- L:Locality,地区、城市
- O:Organization Name,组织名称、公司名称
- OU: Organization Unit Name,组织单位名称,公司名称
- ca.expiry:证书过期时间(默认有效期是1年)生产上一定注意有效期,证书到期会导致集群瘫痪
2. 生成CA证书和私钥
cfssl gencert -initca ca-csr.json
该命令只会打印出证书和私钥,还需通过cfssl-json生成证书和私钥文件
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ca.pem
:ca证书; ca-key.pem
:ca证书私钥
签发证书
准备ca-config.json
技巧:cfssl print-defaults config
能够打印配置文件模板作参考
vi /etc/certs/ca-config.json
{
"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"
]
}
}
}
}
设置了三种证书配置,下面创建证书是指定需要的配置模式
server: 服务器启动需要证书
client: 客户端连接服务端需要证书
peer: 对端通信两端都需要证书
创建peer类型证书(etcd需要的双向证书为例)
- 创建证书请求文件
这里我们用etcd集群需要的双向通信证书制作做演示,结构和上面制作ca证书时的请求文件类似
技巧:cfssl print-defaults csr
能够打印csr文件模板作参考
vi etcd-peer-csr.json
(文件名叫啥无所谓,自己能分清就行)
{
"CN": "k8s-etcd",
"hosts": [
"172.10.10.11",
"172.10.10.12",
"172.10.10.21",
"172.10.10.22"
],
"key": {
"algo": "rsa",
"size": 2048
},
"name": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "hzw",
"OU": "hzwself"
}
]
}
hosts中配置了证书通信可用主机,这里将可能部署etcd的机器都加入,否则后续主机变化只能重新签发证书
- 使用cfssl签发证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etch-peer-csr.json
说明:
gencert:生成证书命令
-ca
、-ca-key
:指定根证书和根证书密钥
-config
、-profile
:指定配置文件和指定配置域(这里需要签双向通信证书,所以指定的是ca-config.json里的peer配置域,内容见上文)
etch-peer-csr.json
是证书请求文件
该命令不会生成证书文件,只会打印证书内容(自己手动拷贝到相应文件也是可以的),可以通过管道符使用cfssljson
工具进一步生成证书文件
[...] | cfssljson -bare etcd-peer
- cfssl-certinfo查看证书信息
cfssl-certinfo -cert apiserver.pem
cfssl-certinfo -domain www.baidu.com
查看指定域名的证书信息