zoukankan      html  css  js  c++  java
  • 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组

    sudo gpasswd -a $user docker  # 用户加入docker组
    newgrp docker    # 刷新docker组状态

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

    一、下载证书生成工具

    官方下载地址: https://pkg.cfssl.org/  。需要下载三个文件,分别是 cfssl_linux-amd64,cfssljson_linux-amd64,cfssl-certinfo_linux-amd64

    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
    

    注:下载慢,可以使用第三方工具,迅雷下载,然后上传至服务器!

    二、给所有工具设置执行权限

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

    三、生成默认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"
            }
        ]
    }
    

    四、生成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
    

     注:如果生成权限问题,将此目录设置为777权限。

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

    五、创建 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地址。

     六、使用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
    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证书生成完成!

  • 相关阅读:
    函数对象
    函数的基本使用
    文件处理
    字符编码
    基本数据类型及内置方法二
    流程控制(if while for)
    Django中ajax的基本用法
    CBV之Django中View类部分源码分析
    前端基础之BOM和DOM
    css基础
  • 原文地址:https://www.cnblogs.com/yangzp/p/15692046.html
Copyright © 2011-2022 走看看