K8s部署使用CFSSL創建證書


證書的編碼格式

PEM(Privacy Enhanced Mail),通常用於數字證書認證機構(Certificate Authorities,CA),擴展名為.pem, .crt, .cer, 和 .key。內容為Base64編碼的ASCII碼文件,有類似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的頭尾標記。服務器認證證書,中級認證證書和私鑰都可以儲存為PEM格式(認證證書其實就是公鑰)。Apache和nginx等類似的服務器使用PEM格式證書。

DER(Distinguished Encoding Rules),與PEM不同之處在於其使用二進制而不是Base64編碼的ASCII。擴展名為.der,但也經常使用.cer用作擴展名,所有類型的認證證書和私鑰都可以存儲為DER格式。Java使其典型使用平台。

證書簽名請求CSR

CSR(Certificate Signing Request),它是向CA機構申請數字×××書時使用的請求文件。在生成請求文件前,我們需要准備一對對稱密鑰。私鑰信息自己保存,請求中會附上公鑰信息以及國家,城市,域名,Email等信息,CSR中還會附上簽名信息。當我們准備好CSR文件后就可以提交給CA機構,等待他們給我們簽名,簽好名后我們會收到crt文件,即證書。

注意:CSR並不是證書。而是向權威證書頒發機構獲得簽名證書的申請。

把CSR交給權威證書頒發機構,權威證書頒發機構對此進行簽名,完成。保留好CSR,當權威證書頒發機構頒發的證書過期的時候,你還可以用同樣的CSR來申請新的證書,key保持不變.

數字簽名

數字簽名就是"非對稱加密+摘要算法",其目的不是為了加密,而是用來防止他人篡改數據。

其核心思想是:比如A要給B發送數據,A先用摘要算法得到數據的指紋,然后用A的私鑰加密指紋,加密后的指紋就是A的簽名,B收到數據和A的簽名后,也用同樣的摘要算法計算指紋,然后用A公開的公鑰解密簽名,比較兩個指紋,如果相同,說明數據沒有被篡改,確實是A發過來的數據。假設C想改A發給B的數據來欺騙B,因為篡改數據后指紋會變,要想跟A的簽名里面的指紋一致,就得改簽名,但由於沒有A的私鑰,所以改不了,如果C用自己的私鑰生成一個新的簽名,B收到數據后用A的公鑰根本就解不開。

常用的摘要算法有MD5、SHA1、SHA256。

使用私鑰對需要傳輸的文本的摘要進行加密,得到的密文即被稱為該次傳輸過程的簽名。

數字證書和公鑰

數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證之后,用CA的根證書對申請人的一些基本信息以及申請人的公鑰進行簽名(相當於加蓋發證書機 構的公章)后形成的一個數字文件。實際上,數字證書就是經過CA認證過的公鑰,除了公鑰,還有其他的信息,比如Email,國家,城市,域名等

CFSSL工具

CFSSL介紹

項目地址: https://github.com/cloudflare/cfssl

下載地址: https://pkg.cfssl.org/

參考鏈接: https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/

CFSSL是CloudFlare開源的一款PKI/TLS工具。 CFSSL 包含一個命令行工具 和一個用於 簽名,驗證並且捆綁TLS證書的 HTTP API 服務。 使用Go語言編寫。

CFSSL包括:

  • 一組用於生成自定義 TLS PKI 的工具

  • cfssl程序,是CFSSL的命令行工具

  • multirootca程序是可以使用多個簽名密鑰的證書頒發機構服務器

  • mkbundle程序用於構建證書池

  • cfssljson程序,從cfsslmultirootca程序獲取JSON輸出,並將證書,密鑰,CSR和bundle寫入磁盤

PKI借助數字證書和公鑰加密技術提供可信任的網絡身份。通常,證書就是一個包含如下身份信息的文件:

  • 證書所有組織的信息

  • 公鑰

  • 證書頒發組織的信息

  • 證書頒發組織授予的權限,如證書有效期、適用的主機名、用途等

  • 使用證書頒發組織私鑰創建的數字簽名

安裝cfssl

curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 
curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
curl -s -L -o /usr/local/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 
chmod +x /usr/local/bin/cfssl*

cfssl工具,子命令介紹:

  • bundle: 創建包含客戶端證書的證書包

  • genkey: 生成一個key(私鑰)和CSR(證書簽名請求)

  • scan: 掃描主機問題

  • revoke: 吊銷證書

  • certinfo: 輸出給定證書的證書信息, 跟cfssl-certinfo 工具作用一樣

  • gencrl: 生成新的證書吊銷列表

  • selfsign: 生成一個新的自簽名密鑰和 簽名證書

  • print-defaults: 打印默認配置,這個默認配置可以用作模板

  • serve: 啟動一個HTTP API服務

  • gencert: 生成新的key(密鑰)和簽名證書

    • -ca:指明ca的證書

    • -ca-key:指明ca的私鑰文件

    • -config:指明請求證書的json文件

    • -profile:與-config中的profile對應,是指根據config中的profile段來生成證書的相關信息

  • ocspdump

  • ocspsign

  • info: 獲取有關遠程簽名者的信息

  • sign: 簽名一個客戶端證書,通過給定的CA和CA密鑰,和主機名

  • ocsprefresh

  • ocspserve

創建認證中心(CA)

CFSSL可以創建一個獲取和操作證書的內部認證中心。

運行認證中心需要一個CA證書和相應的CA私鑰。任何知道私鑰的人都可以充當CA頒發證書。因此,私鑰的保護至關重要。

生成CA證書和私鑰(root 證書和私鑰)

創建一個文件ca-csr.json

{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "ops"
    }
  ]
}

術語介紹:

  • CN: Common Name,kube-apiserver 從證書中提取該字段作為請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法

  • C: Country, 國家

  • L: Locality,地區,城市

  • O: Organization,kube-apiserver 從證書中提取該字段作為請求用戶所屬的 (Group)

  • OU: Organization Unit Name,組織單位名稱,公司部門

  • ST: State,州,省

生成CA證書和CA私鑰和CSR(證書簽名請求):

# cfssl gencert -initca ca-csr.json | cfssljson -bare ca  ## 初始化ca

# ls ca*
ca.csr  ca-csr.json  ca-key.pem  ca.pem

該命令會生成運行CA所必需的文件ca-key.pem(私鑰)和ca.pem(證書),還會生成ca.csr(證書簽名請求),用於交叉簽名或重新簽名。

 

小提示:

使用現有的CA私鑰,重新生成:

cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca

使用現有的CA私鑰和CA證書,重新生成:

cfssl gencert -renewca -ca cert.pem -ca-key key.pem

 

查看cert(證書信息):

# cfssl certinfo -cert ca.pem
 

查看CSR(證書簽名請求)信息:

# cfssl certinfo -csr ca.csr

 

配置證書生成策略

配置證書生成策略,讓CA軟件知道頒發什么樣的證書。

# vim ca-config.json

{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}

 

這個策略,有一個默認的配置,和一個profile,可以設置多個profile,這里的profilekubernetes

  • 默認策略,指定了證書的有效期是十年(87600h)

  • kubernetes策略,指定了證書的用途

  • signing, 表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE

  • server auth:表示 client 可以用該 CA 對 server 提供的證書進行驗證

  • client auth:表示 server 可以用該 CA 對 client 提供的證書進行驗證

容器相關證書類型: client certificate: 用於服務端認證客戶端,例如etcdctl、etcd proxy、fleetctl、docker客戶端
server certificate:  服務端使用,客戶端以此驗證服務端身份,例如docker服務端、kube-apiserver
peer   certificate:  雙向證書,用於etcd集群成員間通信
生成默認CA配置,可以根據生成的默認配置進行實際修改:
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

創建etcd證書

etcd 證書這里,默認配置三個,后續如果需要增加,更多的 etcd 節點 這里的認證IP 請多預留幾個,以備后續添加能通過認證,不需要重新簽發

vim etcd-csr.json

{
"CN": "etcd", "hosts": [ "127.0.0.1", "172.17.213.60", "172.17.213.61", "172.17.213.62" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "ops" } ] }

生成etcd密鑰:

cfssl gencert -ca=/opt/ssl/ca.pem -ca-key=/opt/ssl/ca-key.pem -config=/opt/ssl/config.json -profile=kubernetes  etcd-csr.json | cfssljson -bare etcd

 

 

cfssl常用命令:

  • cfssl gencert -initca ca-csr.json | cfssljson -bare ca ## 初始化ca

  • cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca ## 使用現有私鑰, 重新生成

  • cfssl certinfo -cert ca.pem

  • cfssl certinfo -csr ca.csr

 

 

 

 


免責聲明!

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



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