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證書生成完成!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM