公鑰基礎設施(PKI)/CFSSL證書生成工具的使用

公鑰基礎設施(PKI)

基礎概念

CA(Certification Authority)證書,指的是權威機構給咱們頒發的證書。html

密鑰就是用來加解密用的文件或者字符串。密鑰在非對稱加密的領域裏,指的是私鑰和公鑰,他們老是成對出現,其主要做用是加密和解密。經常使用的加密強度是2048bit。linux

RSA即非對稱加密算法。非對稱加密有兩個不同的密碼,一個叫私鑰,另外一個叫公鑰,用其中一個加密的數據只能用另外一個密碼解開,用本身的都解不了,也就是說用公鑰加密的數據只能由私鑰解開。nginx

證書的編碼格式

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

DER(Distinguished Encoding Rules),與PEM不一樣之處在於其使用二進制而不是Base64編碼的ASCII。擴展名爲.der,但也常用.cer用做擴展名,全部類型的認證證書和私鑰均可以存儲爲DER格式。Java使其典型使用平臺。github

證書籤名請求CSR

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

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

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

數字簽名

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

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

經常使用的摘要算法有MD五、SHA一、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

cfssl用法參考:https://coreos.com/os/docs/latest/generate-self-signed-certificates.html

這裏咱們只用到cfssl工具和cfssljson工具:

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

cfssl工具,子命令介紹:

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

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

  • scan: 掃描主機問題

  • revoke: 吊銷證書

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

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

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

  • print-defaults: 打印默認配置,這個默認配置能夠用做模板

      config:生成ca配置模板文件

      csr:生成證書請求模板文件 

  • serve: 啓動一個HTTP API服務

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

    • -initca:初始化一個新ca

    • -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軟件知道頒發有什麼功能的證書。

#打印config模板文件從而進行修改
#cfssl print-defaults config > ca-config.json

#對模板進行修改,從而變成適合本身的
#vim ca-config.json
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}

這個策略,有一個default默認的配置,和一個profilesprofiles能夠設置多個profile,這裏的profileetcd

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

  • kubernetes:表示該配置(profile)的用途是爲kubernetes生成證書及相關的校驗工做

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

    • server auth:表示能夠該CA 對 server 提供的證書進行驗證

    • client auth:表示能夠用該 CA 對 client 提供的證書進行驗證

  • expiry:也表示過時時間,若是不寫以default中的爲準

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

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

建立一個文件ca-csr.json

#打印csr模板文件從而進行修改
#cfssl print-defaults csr > ca-csr.json

#vim ca-csr.json
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

參數介紹:

  • CN: Common Name,瀏覽器使用該字段驗證網站是否合法,通常寫的是域名。很是重要。瀏覽器使用該字段驗證網站是否合法

  • key:生成證書的算法

  • hosts:表示哪些主機名(域名)或者IP可使用此csr申請的證書,爲空或者""表示全部的均可以使用(本例中沒有hosts字段)

  • names:一些其它的屬性

    • C: Country, 國家

    • ST: State,州或者是省份

    • L: Locality Name,地區,城市

    • O: Organization Name,組織名稱,公司名稱(在k8s中經常使用於指定Group,進行RBAC綁定)

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

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

[root@ks-allinone ssl]# cfssl gencert -initca csr.json | cfssljson -bare ca
2019/08/21 21:10:32 [INFO] generating a new CA key and certificate from CSR
2019/08/21 21:10:32 [INFO] generate received request
2019/08/21 21:10:32 [INFO] received CSR
2019/08/21 21:10:32 [INFO] generating key: ecdsa-256
2019/08/21 21:10:32 [INFO] encoded CSR
2019/08/21 21:10:32 [INFO] signed certificate with serial number 672899525398989895780710333033770062104419034384
[root@ks-allinone ssl]# ll
total 20
-rw-r--r--. 1 root root 505 Aug 21 21:10 ca.csr
-rw-------. 1 root root 227 Aug 21 21:10 ca-key.pem
-rw-r--r--. 1 root root 745 Aug 21 21:10 ca.pem
-rw-r--r--. 1 root root 373 Aug 21 14:21 config.json
-rw-r--r--. 1 root root 287 Aug 21 14:11 csr.json

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

查看cert(證書信息):

# cfssl certinfo -cert ca.pem

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

# cfssl certinfo -csr ca.csr
相關文章
相關標籤/搜索