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(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,國家,城市,域名等。
項目地址: 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
程序,從cfssl
和multirootca
程序獲取JSON輸出,並將證書,密鑰,CSR和bundle寫入磁盤
PKI藉助數字證書和公鑰加密技術提供可信任的網絡身份。一般,證書就是一個包含以下身份信息的文件:
證書全部組織的信息
公鑰
證書頒發組織的信息
證書頒發組織授予的權限,如證書有效期、適用的主機名、用途等
使用證書頒發組織私鑰建立的數字簽名
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
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默認的配置,和一個profiles
,profiles能夠設置多個profile
,這裏的profile
是etcd
。
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-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