etcd使用Cfssl生成自签证书(pem)
CFSSL是CloudFlare开源的一款PKI/TLS工具,CFSSL包含一个命令行工具和一个用于签名,验证并且捆绑TLS证书的HTTP API服务,环境构建方面需要 Go 1.12+。
需要两套证书,一套k8s通讯使用,一套etcd内部通讯使用
安装一些实用的命令行工具,其中包括 cfssl、cfssljson。
cfssljson 程序,从 cfssl 获取 JSON 输出,并将证书、密钥、CSR和 bundle 写入指定位置。
环境配置
HostName | ip | etcd内部通信端口 |外部通信端口
infra0 | 192.168.1.106 | 2379 | 2380 |
infra1 | 192.168.1.108 | 2379 | 2380 |
infra2 | 192.168.1.109 | 2379 | 2380 |
docker 安装
我这已经把docker提前安装了(可以参考下面的A)
A、安装方式,可以参考官方文档:https://docs.docker.com/engine/install/ubuntu/
B、普通用户加入docker组
1 2 | sudo gpasswd -a $user docker # 用户加入docker组<br> newgrp docker # 刷新docker组状态 |
=====================以下在操作在mstart 上执行=====================
一、下载证书生成工具
官方下载地址: https://pkg.cfssl.org/ 。需要下载三个文件,分别是 cfssl_linux-amd64,cfssljson_linux-amd64,cfssl-certinfo_linux-amd64
1 2 3 | https: //github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl_linux-amd64 https: //github.com/cloudflare/cfssl/releases/download/1.2.0/cfssljson_linux-amd64 https: //github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl-certinfo_linux-amd64 |
注:下载慢,可以使用第三方工具,迅雷下载,然后上传至服务器!
二、给所有工具设置执行权限
1 2 3 | yang@master:~$ sudo chmod +x cfssl* yang@master:~$ ls cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64 |
三、生成默认CA配置json配置文件
1 2 3 4 | yang@master:~$ sudo cfssl print-defaults config > ca-config.json yang@master:~$ sudo cfssl print-defaults csr > ca-csr.json yang@master:~$ ls ca-config.json ca-csr.json cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64 |
A、ca-config.json文件内容:
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 | { "signing" : { "default" : { "expiry" : "168h" }, "profiles" : { "www" : { "expiry" : "8760h" , "usages" : [ "signing" , "key encipherment" , "server auth" ] }, "client" : { "expiry" : "8760h" , "usages" : [ "signing" , "key encipherment" , "client auth" ] } } } } |
B、ca-csr.json文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "CN" : "example.net" , "hosts" : [ "example.net" , "www.example.net" ], "key" : { "algo" : "ecdsa" , "size" : 256 }, "names" : [ { "C" : "US" , "L" : "CA" , "ST" : "San Francisco" } ] } |
四、生成CA证书
A、首先修改ca-config.json文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | yang@master:~$ cat ca-config.json { "signing" :{ "default" :{ "expiry" : "876000h" }, "profiles" :{ "kubernetes" :{ "usages" :[ "signing" , "key encipherment" , "server auth" , "client auth" ], "expiry" : "876000h" } } } } |
字段说明:
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:表示client可以用该 CA 对server提供的证书进行验证;
client auth:表示server可以用该CA对client提供的证书进行验证;
B、修改ca-csr.json文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | yang@master:~$ cat ca-csr.json { "CN" : "CA" , "key" : { "algo" : "rsa" , "size" : 2048 }, "names" : [ { "C" : "CN" , "ST" : "xian" , "L" : "shanxi" , "O" : "Kubernetes" , "OU" : "System" } ] } |
CN:Common Name,etcd 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
O:Organization,etcd 从证书中提取该字段作为请求用户所属的组 (Group);
这两个参数在后面的kubernetes启用RBAC模式中很重要,因为需要设置kubelet、admin等角色权限,那么在配置证书的时候就必须配置对了。
C、生产CA证书和私钥
命令:cfssl gencert -initca ca-csr.json | cfssljson -bare ca
1 2 3 4 5 6 7 | yang@master:~$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca 2021/12/15 02:29:56 [INFO] generating a new CA key and certificate from CSR 2021/12/15 02:29:56 [INFO] generate received request 2021/12/15 02:29:56 [INFO] received CSR 2021/12/15 02:29:56 [INFO] generating key: rsa-2048 2021/12/15 02:29:56 [INFO] encoded CSR 2021/12/15 02:29:56 [INFO] signed certificate with serial number 297280955480032641265224573714844144324135690602 |
注:如果生成权限问题,将此目录设置为777权限。
D 、查看生产证书文件
1 2 | yang@master:~$ ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64 |
说明:
根证书文件: ca.pem
根证书私钥: ca-key.pem
根证书申请文件: ca.csr (csr是不是client ssl request?)
五、创建 etcd证书签名请求(etcd-csr.json)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | yang@master:~$ sudo nano etcd-csr.json { "CN" : "etcd" , "hosts" : [ "127.0.0.1" , "192.168.1.106" , "192.168.1.108" , "192.168.1.109" ], "key" : { "algo" : "rsa" , "size" : 2048 }, "names" : [ { "C" : "CN" , "ST" : "xian" , "L" : "shanxi" , "O" : "k8s" , "OU" : "System" } ] } |
说明:
如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被 etcd 集群使用,所以填写IP即可。 因为本次部署etcd是三台,那么则需要填写三台服务器的IP地址。
六、使用ca证书签发etcd证书
1 2 3 4 5 6 | yang@master:~$ sudo cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd 2021/12/15 02:30:47 [INFO] generate received request 2021/12/15 02:30:47 [INFO] received CSR 2021/12/15 02:30:47 [INFO] generating key: rsa-2048 2021/12/15 02:30:47 [INFO] encoded CSR 2021/12/15 02:30:47 [INFO] signed certificate with serial number 655402234356318897903430018951458950558238874375 |
A、查看生成的etcd证书
1 2 3 | yang@master:~$ ls ca-config.json ca-csr.json ca.pem cfssljson_linux-amd64 etcd.csr etcd-key.pem ca.csr ca-key.pem cfssl-certinfo_linux-amd64 cfssl_linux-amd64 etcd-csr.json etcd.pem |
注:可以看出多了etcd.csr、etcd-key.pem、etcd.pem
B、将TLS 认证文件拷贝至证书目录下(三台机器都拷贝)
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 35 36 37 | yang@master:~$ sudo cp etcd*.pem ca*.pem /opt/kubernetes/ssl/ yang@master:/opt/kubernetes/ssl$ ls ca-key.pem ca.pem etcd-key.pem etcd.pem yang@master:/opt/kubernetes$ sudo chmod 777 ssl yang@master:/opt/kubernetes/ssl$ sudo scp etcd*.pem ca*.pem yang@192.168.1.108:/opt/kubernetes/ssl yang@192.168.1.108's password: etcd-key.pem 100% 1679 857.4KB/s 00:00 etcd.pem 100% 1424 2.2MB/s 00:00 ca-key.pem 100% 1679 2.6MB/s 00:00 ca.pem 100% 1298 2.1MB/s 00:00 yang@master:/opt/kubernetes/ssl$ sudo scp etcd*.pem ca*.pem yang@192.168.1.109:/opt/kubernetes/ssl The authenticity of host '192.168.1.109 (192.168.1.109)' can't be established. ECDSA key fingerprint is SHA256:Spztpaw4tS1mizoKjV0+ly+WA9/9N7RxahpsMjAr6U8. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.1.109' (ECDSA) to the list of known hosts. yang@192.168.1.109's password: etcd-key.pem 100% 1679 2.3MB/s 00:00 etcd.pem 100% 1424 1.2MB/s 00:00 ca-key.pem 100% 1679 4.0MB/s 00:00 ca.pem 100% 1298 2.3MB/s 00:00 yang@node1:/opt/kubernetes/ssl$ ll # node1 中文件 total 24 drwxrwxrwx 2 root root 4096 Dec 15 04:13 ./ drwxr-xr-x 4 root root 4096 Dec 15 03:55 ../ -rw------- 1 yang yang 1679 Dec 15 04:13 ca-key.pem -rw-r--r-- 1 yang yang 1298 Dec 15 04:13 ca.pem -rw------- 1 yang yang 1679 Dec 15 04:13 etcd-key.pem -rw-r--r-- 1 yang yang 1424 Dec 15 04:13 etcd.pem yang@node2:/opt/kubernetes/ssl$ ll # node2 中文件 total 24 drwxrwxrwx 2 root root 4096 Dec 15 04:16 ./ drwxr-xr-x 4 root root 4096 Dec 15 03:56 ../ -rw------- 1 yang yang 1679 Dec 15 04:16 ca-key.pem -rw-r--r-- 1 yang yang 1298 Dec 15 04:16 ca.pem -rw------- 1 yang yang 1679 Dec 15 04:16 etcd-key.pem -rw-r--r-- 1 yang yang 1424 Dec 15 04:16 etcd.pem yang@node2:/opt/kubernetes/ssl$ |
注:拷贝文件目录及目标文件目录,都要给777权限,否则会报权限错误。
此时,etcd证书生成完成!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统