背景描述
CA(Certification Authority)证书,指的是权威机构给我们颁发的证书。
在局域网中部署组件时,想要通过证书来实现身份的认证,确保通信的安全性,可以通过cfssl工具来进行CA证书,服务端证书,客户端证书的创建。
部署cfssl工具
下载cfssl,cfssljson,cfssl-certinfo工具
[root@localhost tools]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [root@localhost tools]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [root@localhost tools]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
增加命令的执行权限,并且增加到相关目录
[root@localhost tools]# chmod +x cfssl* [root@localhost tools]# mv cfssl_linux-amd64 /usr/local/bin/cfssl [root@localhost tools]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson [root@localhost tools]# mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
创建认证中心(CA)
CFSSL可以创建一个获取和操作证书的内部认证中心。
运行认证中心需要一个CA证书和相应的CA私钥。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要
配置证书生成策略
配置证书生成策略,让CA软件知道颁发有什么功能的证书。
-
#vim >ca-config.json { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } }
- kubernetes:表示该配置(profile)的用途是为kubernetes生成证书及相关的校验工作
- signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
- server auth:表示可以该CA 对 server 提供的证书进行验证
- client auth:表示可以用该 CA 对 client 提供的证书进行验证
- expiry:也表示过期时间,如果不写以default中的为准
生成CA证书和私钥(root证书和私钥)
创建一个文件ca-csr.json
#vim ca-csr.json { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "ShangHai", "L": "ShangHai", "O": "k8s", "OU": "System" } ] }
参数介绍:
- CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。
- key:生成证书的算法
- hosts:表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用(本例中没有hosts字段)
- names:一些其它的属性
- C: Country, 国家
- ST: State,州或者是省份
- L: Locality Name,地区,城市
- O: Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定)
- OU: Organization Unit Name,组织单位名称,公司部门
生成CA证书和CA私钥和CSR(证书签名请求)
[root@localhost tools]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca 2020/12/04 14:20:39 [INFO] generating a new CA key and certificate from CSR 2020/12/04 14:20:39 [INFO] generate received request 2020/12/04 14:20:39 [INFO] received CSR 2020/12/04 14:20:39 [INFO] generating key: rsa-2048 2020/12/04 14:20:39 [INFO] encoded CSR 2020/12/04 14:20:39 [INFO] signed certificate with serial number 497233672920328375338343228164630446467151606126 [root@localhost tools]# ls -l ca* -rw-r--r-- 1 root root 294 Dec 4 14:13 ca-config.json -rw-r--r-- 1 root root 1045 Dec 4 14:20 ca.csr -rw-r--r-- 1 root root 246 Dec 4 14:19 ca-csr.json -rw------- 1 root root 1675 Dec 4 14:20 ca-key.pem -rw-r--r-- 1 root root 1310 Dec 4 14:20 ca.pem
该命令会生成运行CA所必需的文件ca-key.pem
(私钥)和ca.pem
(证书),还会生成ca.csr
(证书签名请求),用于交叉签名或重新签名。
查看cert(证书信息):
# cfssl certinfo -cert ca.pem
查看CSR(证书签名请求)信息:
# cfssl certinfo -csr ca.csr
创建etcd服务端证书
创建一个文件etcd-csr.json
#vim etcd-csr.json { "CN": "etcd", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Beijing", "O": "DC", "OU": "System" } ] }
用CA签发etcd证书和私钥
cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes etcd-csr.json | cfssljson -bare etcd 2020/12/04 14:33:00 [INFO] generate received request 2020/12/04 14:33:00 [INFO] received CSR 2020/12/04 14:33:00 [INFO] generating key: rsa-2048 2020/12/04 14:33:00 [INFO] encoded CSR 2020/12/04 14:33:00 [INFO] signed certificate with serial number 86899219278041222746661164070003623992607015229 2020/12/04 14:33:00 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). [root@localhost tools]# ls -l etcd* -rw-r--r-- 1 root root 993 Dec 4 14:33 etcd.csr -rw-r--r-- 1 root root 201 Dec 4 14:30 etcd-csr.json -rw------- 1 root root 1679 Dec 4 14:33 etcd-key.pem -rw-r--r-- 1 root root 1383 Dec 4 14:33 etcd.pem
etcd.csr为etcd的证书请求文件,etcd-key.pem为etcd的私钥,etcd.pem为etcd的证书。至此,etcd的证书签发完成。此证书可以作为etcd的服务端证书来使用。