公鑰基礎設施(PKI)/CFSSL證書生成工具的使用
公鑰基礎設施(PKI)
基礎概念
CA(Certification Authority)證書,指的是權威機構給我們頒發的證書。
金鑰就是用來加解密用的檔案或者字串。金鑰在非對稱加密的領域裡,指的是私鑰和公鑰,他們總是成對出現,其主要作用是加密和解密。常用的加密強度是2048bit。
RSA即非對稱加密演算法。非對稱加密有兩個不一樣的密碼,一個叫私鑰,另一個叫公鑰,用其中一個加密的資料只能用另一個密碼解開,用自己的都解不了,也就是說用公鑰加密的資料只能由私鑰解開。
證書的編碼格式
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介紹
專案地址:ofollow,noindex" target="_blank">https://github.com/cloudflare/cfssl
參考連結:https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/
CFSSL是Flare/">CloudFlare開源的一款PKI/TLS工具。 CFSSL 包含一個命令列工具 和一個用於 簽名,驗證並且捆綁TLS證書的 HTTP API 服務。 使用Go語言編寫。
CFSSL包括:
- 一組用於生成自定義 TLS PKI 的工具
- cfssl程式,是CFSSL的命令列工具
- multirootca程式是可以使用多個簽名金鑰的證書頒發機構伺服器
- mkbundle程式用於構建證書池
- cfssljson程式,從cfssl和multirootca程式獲取JSON輸出,並將證書,金鑰,CSR和bundle寫入磁碟
PKI藉助數字證書和公鑰加密技術提供可信任的網路身份。通常,證書就是一個包含如下身份資訊的檔案:
- 證書所有組織的資訊
- 公鑰
- 證書頒發組織的資訊
- 證書頒發組織授予的許可權,如證書有效期、適用的主機名、用途等
- 使用證書頒發組織私鑰建立的數字簽名
安裝cfssl
這裡我們只用到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: 列印預設配置,這個預設配置可以用作模板
serve: 啟動一個HTTP API服務
gencert: 生成新的key(金鑰)和簽名證書
:black_medium_small_square:-ca:指明ca的證書
:black_medium_small_square:-ca-key:指明ca的私鑰檔案
:black_medium_small_square:-config:指明請求證書的json檔案
:black_medium_small_square:-profile:與-config中的profile對應,是指根據config中的profile段來生成證書的相關資訊
ocspdump
ocspsign
info: 獲取有關遠端簽名者的資訊
sign: 簽名一個客戶端證書,通過給定的CA和CA金鑰,和主機名
ocsprefresh
ocspserve
建立認證中心(CA)
CFSSL可以建立一個獲取和操作證書的內部認證中心。
執行認證中心需要一個CA證書和相應的CA私鑰。任何知道私鑰的人都可以充當CA頒發證書。因此,私鑰的保護至關重要。
生成CA證書和私鑰(root 證書和私鑰)
建立一個檔案ca-csr.json:
{
"CN": "www.linuxidc.com",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "linuxidc",
"OU": "ops"
}
]
}
術語介紹:
CN: Common Name,瀏覽器使用該欄位驗證網站是否合法,一般寫的是域名。非常重要。瀏覽器使用該欄位驗證網站是否合法
C: Country, 國家
L: Locality,地區,城市
O: Organization Name,組織名稱,公司名稱
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": "8760h"
},
"profiles": {
"etcd": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
這個策略,有一個預設的配置,和一個profile,可以設定多個profile,這裡的profile是etcd。
預設策略,指定了證書的有效期是一年(8760h)
etcd策略,指定了證書的用途
signing, 表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE
server auth:表示 client 可以用該 CA 對 server 提供的證書進行驗證
client auth:表示 server 可以用該 CA 對 client 提供的證書進行驗證
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
Linux公社的RSS地址 :https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-11/155393.htm