Cfssl生成etcd自签证书(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 |

=====================以下在操作在mstart 上执行=====================

一、下载证书生成工具

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、给所有工具设置执行权限

yang@master:~$ sudo chmod +x cfssl*
yang@master:~$ ls
cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64

2、生成默认CA配置json配置文件

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文件内容:

{
    "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文件内容:

{
    "CN": "example.net",
    "hosts": [
        "example.net",
        "www.example.net"
    ],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "US",
            "L": "CA",
            "ST": "San Francisco"
        }
    ]
}

3、生成CA证书

A、首先修改ca-config.json文件内容:

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文件内容:

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

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

D 、查看生产证书文件

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?)

4、创建 etcd证书签名请求(etcd-csr.json)

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地址。

 5、使用ca证书签发etcd证书

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证书

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 认证文件拷贝至证书目录下(三台机器都拷贝)

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

 

此时,etcd证书生成完成!

 

  

 

上一篇:面试官问我HTTP,我真的是


下一篇:s1.一键自动颁发证书脚本