cfssl 是 CloudFlare 使用golang開發(fā)的 pki/tls 瑞士軍刀級開源工具。它既是一個命令行工具,也是一個用于簽名、驗證和捆綁 tls 證書的 http api 服務(wù)器。我們可以使用它方便快捷地生成tls通信所需要的私鑰和證書。本文重點介紹使用cfssl和cfssl http api服務(wù)器生成證書的詳細(xì)過程。
工具安裝
cfssl官方倉庫地址:
https://github.com/cloudflare/cfssl
可以在此下載到最新的源碼,或者直接下載官方編譯好的二進制文件,當(dāng)前最新的版本為v1.6.5。
cfssl項目包含一系列工具:
$ tree bin
bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca
0 directories, 8 files
其中最常用的有以下這幾個:
cfssl: 用于簽發(fā)證書的標(biāo)準(zhǔn)命令行工具
cfssljson: 將cfssl生成的證書轉(zhuǎn)變?yōu)槲募?/span>
cfssl-certinfo: 驗證和查看證書信息
cfssl 工具通過下面的命令指定需要執(zhí)行的操作:
sign 簽署證書
bundle 構(gòu)建證書包
genkey 生成私鑰和證書請求
gencert 生成私鑰和證書
serve 啟動HTTP API服務(wù)器
version 打印當(dāng)前版本
selfsign 生成自簽名證書
print-defaults 打印默認(rèn)配置
生成證書
生成tls證書首先需要生成CA證書,CA證書分為根CA證書和中間CA證書,根CA證書通常用于簽署其它中間證書,而中間證書則可以用于簽署服務(wù)器所使用的TLS證書。當(dāng)然,根證書也可以用來簽名生成服務(wù)器證書,這里我們直接使用根證書進行簽名。
在生成證書之前,需要創(chuàng)建一個證書請求配置文件,先來創(chuàng)建一個根證書的配置文件:ca-csr.json
{
"CN": "My Root CA",
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "example Inc",
"OU": "IT"
}
],
"ca": {
"expiry": "87600h"
}
}
在這個配置文件中,各項鍵值的含義如下:
CN(Common Name,通用名稱)需要根據(jù)生成的證書類型來確定。對于服務(wù)器證書,一般填寫該服務(wù)器的域名,對于CA證書,一般使用一個標(biāo)識名稱,例如 My Root CA,用以標(biāo)識證書的頒發(fā)機構(gòu)。
key則包含加密算法(algo)和密鑰長度(size),一般使用rsa算法,在安全性要求比較高的場景,密鑰長度可以設(shè)置為4096位。
names,包含多個字段,C指國家代號,ST指省份名稱,L指城市或地區(qū)名稱,O指組織或單位名稱,OU指部門名稱。
ca中的expiry指定CA證書的有效期,對于CA證書一般可以設(shè)置10年(87600小時))。
另外需要注意的是,由于json不支持注釋,因此不能在這個配置文件中添加任何注釋內(nèi)容。
編輯好配置文件內(nèi)容后,就可以使用如下的命令生成根CA證書了。命令最后的ca表示生成的文件將以此作為名稱前綴。
cfssl gencert -initca ca-crs.json | cfssljson -bare ca
在生成服務(wù)器證書之前,可以為cfssl工具創(chuàng)建一個全局配置文件ca-config.json,通過它來定義不同使用場景的證書有效期,用途等。{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "8760h",
"usages": ["signing", "key encipherment", "server auth"]
},
"client": {
"expiry": "8760h",
"usages": ["signing", "key encipherment", "client auth"]
},
"peer": {
"expiry": "8760h",
"usages": ["signing", "key encipherment", "server auth", "client auth"]
},
"ca": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "server auth", "client auth"]
}
}
}
}
接下來,再創(chuàng)建一個服務(wù)器證書請求配置文件server.json,就可以生成服務(wù)器證書了。{
"CN": "*.example.com",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
"*.example.com",
"localhost",
"127.0.0.1"
]
}
需要注意的是,在服務(wù)器證書請求配置文件中,hosts列表中的值需要填寫服務(wù)器的域名、泛域名,主機名和回環(huán)地址等,只有通過hosts中包含的域名、主機名或IP地址等方式訪問該服務(wù)時才可通過認(rèn)證。現(xiàn)在所有準(zhǔn)備工作都已完成,可以使用CA證書來簽名生成服務(wù)器證書了:cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
我們可以使用cfssl-certinfo工具來查看生成的證書信息.cfssl-certinfo -cert server.pem
通過API服務(wù)器生成證書
除了通過命令行工具生成tls證書,cfssl工具還支持啟動一個http服務(wù),通過API請求生成tls證書。
想要啟動一個安全性高的API服務(wù)器,當(dāng)然需要啟用tls,相關(guān)的證書可以通過cfssl命令行生成,然后使用下面的命令啟動:
cfssl serve -address 192.168.100.110 -port 8888 -ca ca.pem -ca-key ca-key.pem -tls-cert cfssl-server.pem -tls-key cfssl-server-key.pem -config ca-config.json
準(zhǔn)備好證書請求配置文件后,就可以通過curl訪問API服務(wù)器生成證書和私鑰了。下面是一個生成CA證書和私鑰的案例:
cat ca-csr.json | curl --cacert /opt/cfssl/cert/ca.pem -s -w "\n" -X POST -H "Content-Type: application/json" -d @- https://192.168.100.110:8888/api/v1/cfssl/init_ca | jq .result | cfssljson -bare ca
生成的證書文件會保存在執(zhí)行命令的當(dāng)前目錄。
- END-
閱讀原文:原文鏈接
該文章在 2025/8/25 13:19:19 編輯過