Kubernetes CFSSL介绍
1.cfssl简介
cfssl具有运行一个认证中心所需要的全部功能,认证中心需要一个CA证书(ca.pem)和相应的私钥(ca-key.pem).
CA:certificate authority 认证证书的第三方机构
X.509:证书标准,主要定义了证书中应该包含哪些内容
PEM: privacy enhanced mail,是X.509证书的一种编码格式,该格式以“------BEGIN------”开头,以“-------END------“结尾,中间内容是BASE64编码
CSR: certificate signing request:证书签名请求,这个并不是证书,而是向权威证书颁发机构获取签名证书的申请
CRT/CER: certificate 证书
2.cfssl 安装配置
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
3.构建本地CA
3.1通过cfssl print-defaults 输出配置模板和模板文件,通过重定向输出内容将输出保存到本地
生成配置模板文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@dn01 sfssltest]# cfssl print-defaults config { "signing": { "default": { "expiry": "168h" }, "profiles": { "www": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "client auth" ] } } } } [root@dn01 sfssltest]# cfssl print-defaults config > config.json [root@dn01 sfssltest]# ls config.json
生成证书信息文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@dn01 sfssltest]# cfssl print-defaults csr { "CN": "example.net", "hosts": [ "example.net", "www.example.net" ], "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] } [root@dn01 sfssltest]# cfssl print-defaults csr > csr.json [root@dn01 sfssltest]# ls csr.json
生成证书
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfssl gencert -initca csr.json | cfssljson -bare ca -
至此基于cfssl的CA已经配置完成,可以通过gencert 自动处理整个证书生成过程,该过程需要两个文件,一个告诉cfssl本地客户端ca的位置以及如何验证请求,即config文件;另一个为csr配置信息,用于填充CSR,即csr文件。
例子:
编写配置文件 ca-config.json
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cat > ca-config.json <<EOF { "signing":{ "default":{ "expiry":"87600h" }, "profiles":{ "kubernetes":{ "expiry":"87600h", "usages":[ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF [root@dn01 sfssltest]# ls ca-config.json
编写证书信息 ca-csr.json
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cat > ca-csr.json <<EOF { "CN":"kubernetes", "key":{ "algo":"rsa", "size":2048 }, "names":[ { "C":"CN", "L":"Beijing", "ST":"Beijing", "O":"k8s", "OU":"System" } ] } EOF [root@dn01 sfssltest]# ls ca-csr.json
生成证书 会自动生成三个文件,分别是:ca.csr ca-key.pem ca.pem
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
3.2 CA建立之后,可以继续签发新的证书
生成服务端的配置模板及证书信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cat > server-csr.json << EOF { "CN":"kubernetes", "hosts":[ "127.0.0.1", "10.10.100.30", "10.10.100.31", "10.10.100.32" ], "key":{ "algo":"rsa", "size":2048 }, "names":[ { "C":"CN", "L":"Beijing", "ST":"Beijing", "O":"k8s", "OU":"System" } ] } EOF
使用以上证书信息生成证书
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare sever
此时会产生三个文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@dn01 sfssltest]# ll -rw-r--r--. 1 root root 376 Sep 10 03:34 server-csr.json -rw-r--r--. 1 root root 1070 Sep 10 03:35 sever.csr -rw-------. 1 root root 1675 Sep 10 03:35 sever-key.pem -rw-r--r--. 1 root root 1444 Sep 10 03:35 sever.pem
集群管理员证书,配置模板及证书信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cat > admin-csr.json <<EOF { "CN":"admin", "hosts":[], "key":{ "algo":"rsa", "size":2048 }, "names":[ { "C":"CN", "L":"Beijing", "ST":"Beijing", "O":"system:masters", "OU":"System" } ] } EOF
生成证书
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
配置及证书信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cat > kube-proxy-csr.json <<EOF { "CN":"system:kube-proxy", "hosts":[], "key":{ "algo":"rsa", "size":2048 }, "names":[ { "C":"CN", "L":"Beijing", "ST":"Beijing", "O":"k8s", "OU":"System" } ] } EOF
生成证书
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=keubernetes kube-proxy-csr.json | cfssjson -bare kube-proxy
4.清除非证书文件,只保留证书
[root@dn01 sfssltest]# ls |grep -v pem |xargs -i rm {}