cfssl是CloudFlare开源的SSL/TLS瑞士军刀,使用go语言编写,可以在github看到源码。
安装&基本配置
go的东西安装最简单,下载后把文件放进/usr/bin/,给个运行权限就ok。
下载地址,这里选个版本,一般用cfssl和cfssljson这2个。
cfssl主要用到3种配置文件
config.json
用于创建服务器或者客户端证书,可以用命令建一个默认的再修改
1
| cfssl print-defaults config > config.json
|
配置里面profiles可以定义几种证书类型,一般是server auth,client auth,peer(相当于server和client合并)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| { "signing": { "default": { "expiry": "8760h" }, "profiles": { "peer": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] }, "server": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "client auth" ] } } } }
|
ca-csr.json
用于初始化ca证书
1
| cfssl print-defaults csr > ca-csr.json
|
初始化ca证书命令:
1
| cfssl gencert -initca ca-csr.json | cfssljson -bare ca
|
签名证书json
这里指服务器或者客户端证书,例如apiserver
1
| cfssl print-defaults csr > apiserver-csr.json
|
创建出膜拜后通过修改成可以使用的证书,注意apiserver的hosts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| { "CN": "k8sdev", "hosts": [ "127.0.0.1", "10.22.0.31", "192.168.10.1", "*.kubernetes.master", "localhost", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Guangdong", "L": "Zhongshan", "O": "k8s", "OU": "System" } ] }
|
创建证书
有了ca.pem、ca-key.pem、config.json和apiserver-csr.json后就能创建服务器证书了,profile选peer
1 2 3 4
| cfssl gencert -ca=ca.pem \ -ca-key=ca-key.pem \ -config=config.json -profile=peer \ apiserver-csr.json | cfssljson -bare apiserver
|
命令运行后生成apiserver.pem、apiserver-key.pem、apiserver.csr
创建普通用户
根据不同的使用场景,创建多个csr.json配置来创建不同的证书,例如这个证书是做k8s rbac认证,相当于用户名devuser,group devuser
devuser.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "CN": "devuser", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Guangdong", "L": "Zhongshan", "O": "devuser", "OU": "Mon" } ] }
|
profile选client,表示证书用于客户端认证
1 2 3 4
| cfssl gencert -ca=k8s-root-ca.pem \ -ca-key=k8s-root-ca-key.pem \ -config=config.json -profile=client \ devuser-csr.json | cfssljson -bare devuser
|
命令运行后生成devuser.pem、devuser-key.pem、devuser.csr,我们一般使用前2个
base64编码
kubeconfig的user证书可以直接写进base64编码后的内容,在linux运行下面命令得到base64数据
1 2
| cat devuser.pem | base64 | xargs | sed 's/ //g' cat devuser-key.pem | base64 | xargs | sed 's/ //g'
|
xargs 使输出变成单行
写进kubeconfig
1 2 3 4 5
| users: - name: devuser user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV6ekNDQXJlZ0F3SUJBZ0lVWmF....... client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBL......
|