kubernetes實踐之六:CFSSL構建本地CA

百聯達發表於2018-03-21
一:前言

SSL:Secure Sockets Layer,標準化後叫"TLS",http協議預設情況下是不加密內容的,這樣就很可能在內容傳播的時候被別人監聽到,對於安全性要求較高的場合,必須要加密,https就是帶加密的http協議。
訊息-->[公鑰]-->加密後的資訊-->[私鑰]-->訊息




CAcertificate authority 認證證書的第三方機構。

X.509證書標準,主要定義了證書中應該包含哪些內容.其詳情可以參考RFC5280,SSL使用的就是這種證書標準.

PEM Privacy Enhanced Mail,同樣的X.509證書,可能有不同的編碼格式,pem是其中的一種編碼格式。該種格式以“------BEGIN------”開頭,以“------END------”結尾,中間內容是BASE64編碼。

CSRCertificate Signing Request,即證書籤名請求,這個並不是證書,而是向權威證書頒發機構獲得簽名證書的申請

CRT/CER :certificate 證書。

PKIpublic key infrastructure公鑰基礎設施。使用內部託管的認證中心(CA)PKI藉助數字證書和公鑰加密技術提供可信任的網路身份。通常,證書就是一個包含如下身份資訊的檔案:

  • 證書所有組織的資訊
  • 公鑰
  • 證書頒發組織的資訊
  • 證書頒發組織授予的許可權,如證書有效期、適用的主機名、用途等
  • 使用證書頒發組織私鑰建立的數字簽名
每個公鑰都有一個對應的私鑰,後者在證書所有者的管控之下,可以用於對資料進行數字簽名,驗證器可以使用證書中的公鑰對資料進行驗證。如果證書本身包含第三方認證中心的數字簽名,那麼只要驗證器信任該第三方,就可以確保證書是合法的。有時候,證書是由中介認證中心簽名,而中介認證中心的證書又是由不同的認證中心簽名。在這種情況下,證書驗證器會沿著這條鏈一直找到它信任的證書。對於認證中心而言,信任鏈模型非常有用,它允許我們將根證書的私鑰離線儲存,只為中介證書籤名。


二:CFSSL構建本地CA

1.建立自己的認證中心
CFSSL具有執行一個認證中心所需的全部功能。雖然CFSSL是為執行內部CA而建立,但它足夠健壯,可以用於公開的受信任CA。
執行認證中心需要一個CA證書(ca.pem)和相應的私鑰(ca-key.pem)。後者是極其敏感的資料。任何知道私鑰的人都可以充當CA頒發證書。因此,私鑰的保護至關重要。

2. 生成CA證書和私鑰

建立ca-csr.json檔案

點選(此處)摺疊或開啟

  1. {
  2.     "CN": "kubernetes",
  3.     "key": {
  4.         "algo": "rsa",
  5.         "size": 2048
  6.     },
  7.     "names": [
  8.         {
  9.             "C": "CN",
  10.             "L": "BeiJing",
  11.             "ST": "BeiJing",
  12.             "O": "k8s",
  13.             "OU": "System"
  14.         }
  15.     ]
  16. }

”CN“:Common Name,kube-apiserver 從證書中提取該欄位作為請求的?戶名 (User Name);瀏覽器使用該欄位驗證網站是否合法
"O":Organization ,kube-apiserver 從證書中提取該欄位作為請求?戶所屬的組 (Group);

執行命令 cfssl gencert -initca ca-csr.json | cfssljson -bare ca

生成: ca.pem     ca-key.pem   ca.csr(證書籤名請求,用於交叉簽名或重新簽名)

3.配置證書生成策略

配置證書生成策略,讓CA軟體知道頒發什麼樣的證書.建立ca-config.json

點選(此處)摺疊或開啟

  1. {
  2. "signing": {
  3.   "default": {
  4.     "expiry": "87600h"
  5.    },
  6.   "profiles": {
  7.      "kubernetes": {
  8.        "usages": [
  9.           "signing",
  10.           "key encipherment",
  11.           "server auth",
  12.           "client auth"
  13.         ],
  14.         "expiry": "87600h"
  15.        }
  16.     }
  17.   }
  18. }
ca-config.jso: 可以定義多個profiles,分別指定不同的過期時間,使用場景等引數,這裡我們只定義了kubernetes一個profile
signing : 表示該證書可用於簽名其它證書,生成的ca.pem證書中  CA=TRUE
server auth : 表示client可以使用該CA對server提供的證書進行驗證
client auth : 表示server 可以用該CA對client提供的證書進行驗證

4.證書生成與簽名

截止目前,基於CFSSL的CA已經配置完成,該CA如何頒發證書呢?CFSSL提供了兩個命令:gencertsigngencert將自動處理整個證書生成過程。該過程需要兩個檔案,一個告訴CFSSL本地客戶端CA的位置以及如何驗證請求,即config檔案,另一個為CSR配置資訊,用於填充CSR 即csr檔案

舉例:建立 kubernetes 證書籤名請求?件 kubernetes-csr.json (config檔案採用之前的ca-config.json

點選(此處)摺疊或開啟

  1. {
  2.     "CN": "kubernetes",
  3.     "hosts": [
  4.         "127.0.0.1",
  5.         "10.116.137.196",
  6.         "10.116.82.28",
  7.         "10.116.36.57",
  8.         "10.254.0.1",
  9.         "kubernetes",
  10.         "kubernetes.default",
  11.         "kubernetes.default.svc",
  12.         "kubernetes.default.svc.cluster",
  13.         "kubernetes.default.svc.cluster.local"
  14.     ],
  15.     "key": {
  16.     "algo":"rsa",
  17.     "size":2048
  18.     },
  19.     "names": [
  20.         {
  21.             "C": "CN",
  22.             "L": "BeiJing",
  23.             "ST": "BeiJing",
  24.             "O": "k8s",
  25.             "OU": "System"
  26.         }
  27.     ]
  28. }
如果 hosts 欄位不為空則需要指定授權使用該證書的 IP 或域名列表,由於該證書後續被 etcd 叢集和 kubernetes master 叢集使用,所以上面分別指定了 etcd 叢集、 kubernetes master 叢集的主機 IP 和 kubernetes 服務的服務 IP(一般是 kube-apiserver 指定的 service-cluster-ip-range 網段的第一個IP,如 10.254.0.1。

hosts 中的內容可以為空,即使按照上面的配置,向叢集中增加新節點後也不需要重新生成證書。

執行命令:cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

生成 kubernetes.csr    kubernetes-key.pem   kubernetes.pem 檔案

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2152064/,如需轉載,請註明出處,否則將追究法律責任。

相關文章