公鑰基礎(chǔ)設(shè)施(PKI)
基礎(chǔ)概念
CA(Certification Authority)證書(shū),指的是權(quán)威機(jī)構(gòu)給我們頒發(fā)的證書(shū)。
密鑰就是用來(lái)加解密用的文件或者字符串。密鑰在非對(duì)稱加密的領(lǐng)域里,指的是私鑰和公鑰,他們總是成對(duì)出現(xiàn),其主要作用是加密和解密。常用的加密強(qiáng)度是2048bit。
RSA即非對(duì)稱加密算法。非對(duì)稱加密有兩個(gè)不一樣的密碼,一個(gè)叫私鑰,另一個(gè)叫公鑰,用其中一個(gè)加密的數(shù)據(jù)只能用另一個(gè)密碼解開(kāi),用自己的都解不了,也就是說(shuō)用公鑰加密的數(shù)據(jù)只能由私鑰解開(kāi)。
證書(shū)的編碼格式
PEM(Privacy Enhanced Mail),通常用于數(shù)字證書(shū)認(rèn)證機(jī)構(gòu)(Certificate Authorities,CA),擴(kuò)展名為.pem, .crt, .cer, 和 .key。內(nèi)容為Base64編碼的ASCII碼文件,有類(lèi)似”—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–“的頭尾標(biāo)記。服務(wù)器認(rèn)證證書(shū),中級(jí)認(rèn)證證書(shū)和私鑰都可以儲(chǔ)存為PEM格式(認(rèn)證證書(shū)其實(shí)就是公鑰)。Apache和nginx等類(lèi)似的服務(wù)器使用PEM格式證書(shū)。
DER(Distinguished Encoding Rules),與PEM不同之處在于其使用二進(jìn)制而不是Base64編碼的ASCII。擴(kuò)展名為.der,但也經(jīng)常使用.cer用作擴(kuò)展名,所有類(lèi)型的認(rèn)證證書(shū)和私鑰都可以存儲(chǔ)為DER格式。Java使其典型使用平臺(tái)。
證書(shū)簽名請(qǐng)求CSR
CSR(Certificate Signing Request),它是向CA機(jī)構(gòu)申請(qǐng)數(shù)字×××書(shū)時(shí)使用的請(qǐng)求文件。在生成請(qǐng)求文件前,我們需要準(zhǔn)備一對(duì)對(duì)稱密鑰。私鑰信息自己保存,請(qǐng)求中會(huì)附上公鑰信息以及國(guó)家,城市,域名,Email等信息,CSR中還會(huì)附上簽名信息。當(dāng)我們準(zhǔn)備好CSR文件后就可以提交給CA機(jī)構(gòu),等待他們給我們簽名,簽好名后我們會(huì)收到crt文件,即證書(shū)。
注意:CSR并不是證書(shū)。而是向權(quán)威證書(shū)頒發(fā)機(jī)構(gòu)獲得簽名證書(shū)的申請(qǐng)。
把CSR交給權(quán)威證書(shū)頒發(fā)機(jī)構(gòu),權(quán)威證書(shū)頒發(fā)機(jī)構(gòu)對(duì)此進(jìn)行簽名,完成。保留好CSR,當(dāng)權(quán)威證書(shū)頒發(fā)機(jī)構(gòu)頒發(fā)的證書(shū)過(guò)期的時(shí)候,你還可以用同樣的CSR來(lái)申請(qǐng)新的證書(shū),key保持不變.
數(shù)字簽名
數(shù)字簽名就是”非對(duì)稱加密+摘要算法”,其目的不是為了加密,而是用來(lái)防止他人篡改數(shù)據(jù)。
其核心思想是:比如A要給B發(fā)送數(shù)據(jù),A先用摘要算法得到數(shù)據(jù)的指紋,然后用A的私鑰加密指紋,加密后的指紋就是A的簽名,B收到數(shù)據(jù)和A的簽名后,也用同樣的摘要算法計(jì)算指紋,然后用A公開(kāi)的公鑰解密簽名,比較兩個(gè)指紋,如果相同,說(shuō)明數(shù)據(jù)沒(méi)有被篡改,確實(shí)是A發(fā)過(guò)來(lái)的數(shù)據(jù)。假設(shè)C想改A發(fā)給B的數(shù)據(jù)來(lái)欺騙B,因?yàn)榇鄹臄?shù)據(jù)后指紋會(huì)變,要想跟A的簽名里面的指紋一致,就得改簽名,但由于沒(méi)有A的私鑰,所以改不了,如果C用自己的私鑰生成一個(gè)新的簽名,B收到數(shù)據(jù)后用A的公鑰根本就解不開(kāi)。
常用的摘要算法有MD5、SHA1、SHA256。
使用私鑰對(duì)需要傳輸?shù)奈谋镜恼M(jìn)行加密,得到的密文即被稱為該次傳輸過(guò)程的簽名。
數(shù)字證書(shū)和公鑰
數(shù)字證書(shū)則是由證書(shū)認(rèn)證機(jī)構(gòu)(CA)對(duì)證書(shū)申請(qǐng)者真實(shí)身份驗(yàn)證之后,用CA的根證書(shū)對(duì)申請(qǐng)人的一些基本信息以及申請(qǐng)人的公鑰進(jìn)行簽名(相當(dāng)于加蓋發(fā)證書(shū)機(jī) 構(gòu)的公章)后形成的一個(gè)數(shù)字文件。實(shí)際上,數(shù)字證書(shū)就是經(jīng)過(guò)CA認(rèn)證過(guò)的公鑰,除了公鑰,還有其他的信息,比如Email,國(guó)家,城市,域名等。
CFSSL工具
CFSSL介紹
項(xiàng)目地址: https://github.com/cloudflare/cfssl
下載地址: https://pkg.cfssl.org/
參考鏈接: https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/
CFSSL是CloudFlare開(kāi)源的一款PKI/TLS工具。 CFSSL 包含一個(gè)命令行工具 和一個(gè)用于 簽名,驗(yàn)證并且捆綁TLS證書(shū)的 HTTP API 服務(wù)。 使用Go語(yǔ)言編寫(xiě)。
CFSSL包括:
- 一組用于生成自定義 TLS PKI 的工具
- cfssl程序,是CFSSL的命令行工具
- multirootca程序是可以使用多個(gè)簽名密鑰的證書(shū)頒發(fā)機(jī)構(gòu)服務(wù)器
- mkbundle程序用于構(gòu)建證書(shū)池
- cfssljson程序,從cfssl和multirootca程序獲取JSON輸出,并將證書(shū),密鑰,CSR和bundle寫(xiě)入磁盤(pán)
PKI借助數(shù)字證書(shū)和公鑰加密技術(shù)提供可信任的網(wǎng)絡(luò)身份。通常,證書(shū)就是一個(gè)包含如下身份信息的文件:
- 證書(shū)所有組織的信息
- 公鑰
- 證書(shū)頒發(fā)組織的信息
- 證書(shū)頒發(fā)組織授予的權(quán)限,如證書(shū)有效期、適用的主機(jī)名、用途等
- 使用證書(shū)頒發(fā)組織私鑰創(chuàng)建的數(shù)字簽名
安裝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: 創(chuàng)建包含客戶端證書(shū)的證書(shū)包
genkey: 生成一個(gè)key(私鑰)和CSR(證書(shū)簽名請(qǐng)求)
scan: 掃描主機(jī)問(wèn)題
revoke: 吊銷(xiāo)證書(shū)
certinfo: 輸出給定證書(shū)的證書(shū)信息, 跟cfssl-certinfo 工具作用一樣
gencrl: 生成新的證書(shū)吊銷(xiāo)列表
selfsign: 生成一個(gè)新的自簽名密鑰和 簽名證書(shū)
print-defaults: 打印默認(rèn)配置,這個(gè)默認(rèn)配置可以用作模板
serve: 啟動(dòng)一個(gè)HTTP API服務(wù)
gencert: 生成新的key(密鑰)和簽名證書(shū)
◾-ca:指明ca的證書(shū)
◾-ca-key:指明ca的私鑰文件
◾-config:指明請(qǐng)求證書(shū)的json文件
◾-profile:與-config中的profile對(duì)應(yīng),是指根據(jù)config中的profile段來(lái)生成證書(shū)的相關(guān)信息
ocspdump
ocspsign
info: 獲取有關(guān)遠(yuǎn)程簽名者的信息
sign: 簽名一個(gè)客戶端證書(shū),通過(guò)給定的CA和CA密鑰,和主機(jī)名
ocsprefresh
ocspserve
創(chuàng)建認(rèn)證中心(CA)
CFSSL可以創(chuàng)建一個(gè)獲取和操作證書(shū)的內(nèi)部認(rèn)證中心。
運(yùn)行認(rèn)證中心需要一個(gè)CA證書(shū)和相應(yīng)的CA私鑰。任何知道私鑰的人都可以充當(dāng)CA頒發(fā)證書(shū)。因此,私鑰的保護(hù)至關(guān)重要。
生成CA證書(shū)和私鑰(root 證書(shū)和私鑰)
創(chuàng)建一個(gè)文件ca-csr.json:
{
“CN”: “www.linuxidc.com”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “linuxidc”,
“OU”: “ops”
}
]
}
術(shù)語(yǔ)介紹:
CN: Common Name,瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法,一般寫(xiě)的是域名。非常重要。瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法
C: Country, 國(guó)家
L: Locality,地區(qū),城市
O: Organization Name,組織名稱,公司名稱
OU: Organization Unit Name,組織單位名稱,公司部門(mén)
ST: State,州,省
生成CA證書(shū)和CA私鑰和CSR(證書(shū)簽名請(qǐng)求):
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca ## 初始化ca
# ls ca*
ca.csr ca-csr.json ca-key.pem ca.pem
該命令會(huì)生成運(yùn)行CA所必需的文件ca-key.pem(私鑰)和ca.pem(證書(shū)),還會(huì)生成ca.csr(證書(shū)簽名請(qǐng)求),用于交叉簽名或重新簽名。
小提示:
使用現(xiàn)有的CA私鑰,重新生成:
cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca
使用現(xiàn)有的CA私鑰和CA證書(shū),重新生成:
cfssl gencert -renewca -ca cert.pem -ca-key key.pem
查看cert(證書(shū)信息):
# cfssl certinfo -cert ca.pem
查看CSR(證書(shū)簽名請(qǐng)求)信息:
# cfssl certinfo -csr ca.csr
配置證書(shū)生成策略
配置證書(shū)生成策略,讓CA軟件知道頒發(fā)什么樣的證書(shū)。
# vim ca-config.json
{
“signing”: {
“default”: {
“expiry”: “8760h”
},
“profiles”: {
“etcd”: {
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
],
“expiry”: “8760h”
}
}
}
}
這個(gè)策略,有一個(gè)默認(rèn)的配置,和一個(gè)profile,可以設(shè)置多個(gè)profile,這里的profile是etcd。
默認(rèn)策略,指定了證書(shū)的有效期是一年(8760h)
etcd策略,指定了證書(shū)的用途
signing, 表示該證書(shū)可用于簽名其它證書(shū);生成的 ca.pem 證書(shū)中 CA=TRUE
server auth:表示 client 可以用該 CA 對(duì) server 提供的證書(shū)進(jìn)行驗(yàn)證
client auth:表示 server 可以用該 CA 對(duì) client 提供的證書(shū)進(jìn)行驗(yàn)證
cfssl常用命令:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca ## 初始化ca
cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca ## 使用現(xiàn)有私鑰, 重新生成
cfssl certinfo -cert ca.pem
cfssl certinfo -csr ca.csr