自簽名證書工具cfssl詳解
概述
GitHub地址:https://github.com/cloudflare/cfssl
官方地址:https://pkg.cfssl.org
CFSSL(CloudFlare's PKI and TLS toolkit)由 CloudFlare 用go語言開發(fā)的一個(gè)開源工具,用于證書簽名、驗(yàn)證和管理。
生成自簽證書的方式有多種,CFSSL支持簽發(fā)三種類型的證書:?client證書、?server證書以及集群成員之間的peer證書。推薦使用cfssl工具或者openssl工具來生成,openssl也是開源的證書生成工具。
生成證書基本概念
CA(證書頒發(fā)機(jī)構(gòu))
CA(Certificate Authority)是 PKI(公鑰基礎(chǔ)設(shè)施)體系的核心信任錨點(diǎn),負(fù)責(zé):
? 證書簽名:驗(yàn)證申請(qǐng)者身份后,使用自己的私鑰為其頒發(fā)數(shù)字證書。
? 信任分發(fā):通過公開的根證書(Root CA),讓客戶端信任其簽署的所有證書。
? 證書管理:包括證書頒發(fā)、更新、撤銷和狀態(tài)查詢(OCSP/CRL)。
CA證書類型類型分為三類,分別是:
? 根 CA(Root CA):
自簽名證書,位于信任鏈頂端。
通常離線存儲(chǔ),極少直接簽署終端用戶證書。
? 中間 CA(Intermediate CA):
由根 CA 簽署,用于分擔(dān)證書簽署工作。
即使私鑰泄露,影響范圍也僅限于其簽署的證書。
? 終端 CA:
直接簽署服務(wù)器 / 客戶端證書的 CA。
安全規(guī)范實(shí)踐:
? 分層設(shè)計(jì):使用根 CA → 中間 CA → 終端證書的三級(jí)結(jié)構(gòu)。
? 私鑰保護(hù):根 CA 私鑰必須離線存儲(chǔ)(如 HSM 硬件安全模塊)。
? 定期輪換:中間 CA 證書有效期通常為 3-5 年,需定期更新。
CSR(證書簽名請(qǐng)求)
CSR(Certificate Signing Request)是客戶端向 CA 提交的申請(qǐng)文件,創(chuàng)建證書前需要先生成 CSR。
CSR文件通常包含以下信息:
? 公鑰:申請(qǐng)者生成的公鑰。
? 身份信息:如域名、組織名稱、國家代碼等。
? 擴(kuò)展字段:如 SAN(Subject Alternative Name)、密鑰用途等。
生產(chǎn)CSR的注意事項(xiàng):
? 私鑰絕對(duì)保密:CSR 生成過程中產(chǎn)生的私鑰需嚴(yán)格保密,不可泄露。
? 信息準(zhǔn)確性:CSR 中的域名(CN/SAN)必須與服務(wù)器實(shí)際域名一致,否則 TLS 握手會(huì)失敗。
證書配置文件
主要用來定義證書的使用場(chǎng)景、有效期等參數(shù),CFSSL使用 JSON 格式(如 ca-config.json)的證書配置文件
三者工作流程:
image
Linux安裝cfssl工具
cfssl依賴三個(gè)工具包,分別是:cfssl、cfssljson、cfss-certinfo
? cfssl:cfssl 是工具集的核心,提供了證書生命周期管理的所有功能:
? 證書生成:創(chuàng)建自簽名證書、CA 證書和用戶證書。
? 證書簽名:處理證書簽名請(qǐng)求(CSR)并頒發(fā)證書。
? 配置管理:使用 JSON 配置文件定義證書策略和使用場(chǎng)景。
? CA 管理:創(chuàng)建和管理證書頒發(fā)機(jī)構(gòu)(CA)層次結(jié)構(gòu)。
? OCSP/CRL:生成在線證書狀態(tài)協(xié)議(OCSP)響應(yīng)和證書撤銷列表(CRL)。
? cfssljson:專門用于處理 cfssl 輸出的 JSON 數(shù)據(jù),主要功能包括:
? 解析 JSON 輸出:將 cfssl 生成的 JSON 格式證書、密鑰和 CSR 轉(zhuǎn)換為單獨(dú)的文件。
? 文件保存:自動(dòng)創(chuàng)建并保存證書(.pem)、私鑰(.key)和 CSR(.csr)文件。
? cfssl-certinfo:用于查看和驗(yàn)證證書的詳細(xì)信息,功能包括:
? 證書解析:顯示證書的元數(shù)據(jù)(如有效期、頒發(fā)者、主題、公鑰等)。
? 證書鏈驗(yàn)證:檢查證書的簽名鏈?zhǔn)欠裼行А?/p>
? 格式轉(zhuǎn)換:將證書以人類可讀的格式輸出。
下載工具
curl -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 | curl -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 | curl -L -o /usr/local/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 |
授予執(zhí)行權(quán)限
chmod+x /usr/local/bin/cfssl* |
cfssl gencert命令詳解
cfssl gencert 是 CloudFlare PKI 工具集中用于生成證書簽名請(qǐng)求(CSR)和證書的核心命令。
核心參數(shù):
? -ca [path]:指定用于簽名的 CA 證書文件路徑(PEM 格式)。
示例:-ca=ca.pem |
? -ca-key [path]:指定 CA 的私鑰文件路徑(PEM 格式)。
示例:-ca-key=ca-key.pem |
? -config [path]:指定證書簽名配置文件(JSON 格式),定義證書的有效期、用途等策略。
示例:-config=ca-config.json| |
? -profile [name]:指定使用配置文件中的哪個(gè)簽名策略。對(duì)應(yīng)CA配置文件中的profiles字段,其值可以為server、client、peer、ca、kubernets等
示例:-profile=server |
? -hostname [list]:指定證書的 Subject Alternative Name (SAN) 字段,包含域名和 IP 地址,多個(gè)值用逗號(hào)分隔
示例:-hostname=example.com,www.example.com,192.168.1.1 |
? -cn [name]:指定證書的 Common Name (CN)
示例:-cn="My Server"|
? -key-algo [algo]:指定密鑰算法,支持 rsa、ecdsa 等,默認(rèn)rsa
示例:-key-algo=rsa |
? -key-size [bits]:指定密鑰長度(RSA 建議 2048+,ECDSA 建議 256+)
示例:-key-size=2048|
? -initca:生成自簽名的根 CA 證書。
示例:cfssl gencert -initca ca-csr.json| |
? -self-signed:生成自簽名證書(非 CA 證書)
示例:cfssl gencert -self-signedserver.json |
實(shí)戰(zhàn):生成證書
創(chuàng)建根CA文件
# 根ca文件,需要將注釋去掉 |
[root@master ~/cfssl]#catca-config.json |
{ |
"signing": { |
"default": { |
# 配置默認(rèn)證書有效期為10年,通常用于根CA證書 |
"expiry":"87600h"|
}, |
"profiles": { |
# 定義server端的證書 |
"server": { |
# 1年有效期 |
"expiry":"8760h", |
"usages": ["signing","key encipherment","server auth"] |
}, |
# 定義client端的證書,有效期為一年 |
"client": { |
"expiry":"8760h", |
"usages": ["signing","key encipherment","client auth"] |
}, |
# 定義peer端的證書,有效期為一年 |
"peer": { |
"expiry":"8760h", |
"usages": ["signing","key encipherment","server auth","client auth"] |
}, |
# 定義kubernetes的證書,有效期為一年 |
"kubernetes": { |
"expiry":"8760h", |
"usages": ["signing","key encipherment","server auth","client auth"] |
}, |
# 定義ca的證書,有效期為五年 |
"ca": { |
"expiry":"43800h", |
"usages": ["signing","key encipherment","server auth","client auth"] |
} |
} |
} |
} |
配置文件字段說明:
usages:指定的證書用途
? signing:允許證書用于數(shù)字簽名。數(shù)字簽名可以確保數(shù)據(jù)在傳輸過程中不被篡改,并且可以驗(yàn)證數(shù)據(jù)的來源。
? key encipherment:允許證書用于加密密鑰。在 TLS 握手過程中,客戶端和服務(wù)器會(huì)交換會(huì)話密鑰,這個(gè)過程通常使用證書進(jìn)行加密。
? server auth:專門用于服務(wù)器身份驗(yàn)證。當(dāng)客戶端連接到服務(wù)器時(shí),服務(wù)器會(huì)出示自己的證書,客戶端會(huì)驗(yàn)證這個(gè)證書是否由信任的 CA 頒發(fā),以及證書中的域名是否與自己要訪問的域名一致。
? client auth:專門用于客戶端身份驗(yàn)證。在雙向 TLS 中,服務(wù)器也會(huì)要求客戶端提供證書,以驗(yàn)證客戶端的身份。
各端證書使用場(chǎng)景:
? server:HTTPS 網(wǎng)站、SMTP、IMAP、POP3 等郵件服務(wù)器、VPN 服務(wù)器、任何需要向客戶端證明自己身份的服務(wù)
? client:企業(yè)內(nèi)部應(yīng)用,要求員工使用客戶端證書登錄、API 訪問,使用客戶端證書進(jìn)行身份驗(yàn)證、安全郵件客戶端,使用證書進(jìn)行身份驗(yàn)證
? peer:區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點(diǎn)通信、分布式系統(tǒng)中節(jié)點(diǎn)間的安全通信、金融機(jī)構(gòu)之間的安全數(shù)據(jù)交換
? kubernetes:Kubernetes 組件證書(如 API Server、etcd)。
? ca:中間 CA 證書(需配合 -ca 參數(shù)使用)。
創(chuàng)建根 CA CSR 配置文件
# 定義CSR文件,需要將json文件中的注釋去掉 |
[root@master ~/cfssl]#catca-csr.json |
{ |
# 根 CA 的通用名稱,對(duì)于服務(wù)器證書,CN 通常是域名(如www.example.com); |
# 對(duì)于 CA 證書,CN 是 CA 的標(biāo)識(shí)名稱。 |
"CN":"My Root CA", |
"key": { |
# 加密算法 |
"algo":"rsa", |
# 密鑰長度 |
"size": 4096 |
}, |
"names": [ |
{ |
# 國家代碼,CN代表是中國 |
"C":"CN", |
# 省份 |
"ST":"Beijing", |
# 城市或地區(qū) |
"L":"Beijing", |
# 組織名稱(Organization),可以理解成公司名稱 |
"O":"rootca", |
# 組織單位(Organizational Unit),可以理解成公司部門 |
"OU":"ca"|
} |
], |
# 根 CA 證書的配置,指定有效期為10年 |
"ca": { |
"expiry":"87600h"|
} |
} |
生成根 CA 證書和私鑰
[root@master ~/cfssl]#cfsslgencert-initcaca-csr.json|cfssljson-bareca/ca| 2025/05/1511:23:34[INFO]generatinganewCAkeyandcertificatefromCSR| 2025/05/1511:23:34[INFO]generatereceivedrequest| 2025/05/1511:23:34[INFO]receivedCSR| 2025/05/1511:23:34[INFO]generatingkey:rsa-4096| 2025/05/1511:23:34[INFO]encodedCSR| 2025/05/1511:23:34[INFO]signedcertificatewithserialnumber492661591325776778969123330542788728689689366584|
命令解釋:
cfssl gencert:cfssl 工具的子命令,用于生成證書| -initca:指定生成自簽名的根 CA 證書 | ca-csr.json:證書簽名請(qǐng)求(CSR)的配置文件路徑,對(duì)應(yīng)上面創(chuàng)建的ca-csr.json| | cfssljson:處理 cfssl 生成的JSON輸出并轉(zhuǎn)換為文件| -bare ca:指定輸出文件名前綴為 ca,會(huì)生成以下三個(gè)文件: | ca.pem:根 CA 證書(自簽名)| ca-key.pem:根 CA 的私鑰(必須嚴(yán)格保密?。?| ca.csr:證書簽名請(qǐng)求(通常自簽名 CA 不需要保留此文件)|
查看當(dāng)前的目錄:
[root@master ~/cfssl]# tree | . | ├── ca | │ ├── ca.csr | │ ├── ca-key.pem# 根 CA 私鑰(嚴(yán)格保密?。?| │ └── ca.pem#根 CA 證書(公鑰,需分發(fā)給客戶端) | ├── ca-config.json | ├── ca-csr.json |
生成中間CA證書和私鑰
中間CA證書文件
[root@master ~/cfssl]#catintermediate-csr.json |
{ |
"CN":"My Intermediate CA", |
"key": { |
"algo":"rsa", |
"size": 4096 |
}, |
"names": [ |
{ |
"C":"CN", |
"ST":"Beijing", |
"L":"Beijing", |
"O":"baidu", |
"OU":"Intermediate CA"|
} |
] |
} |
生成中間 CA 證書和私鑰
[root@master ~/cfssl]# cfssl gencert | -ca=ca/ca.pem | -ca-key=ca/ca-key.pem | -config=ca-config.json | -profile=ca | intermediate-csr.json| cfssljson -bare intermediate/intermediate | 2025/05/1511:29:49[INFO]generatereceived request | 2025/05/1511:29:49[INFO] received CSR | 2025/05/1511:29:49[INFO] generating key: rsa-4096| 2025/05/1511:29:49[INFO] encoded CSR | 2025/05/1511:29:49[INFO]signedcertificatewithserial number722124812765078011706922545691404003361157472292| 2025/05/1511:29:49[WARNING] This certificate lacks a"hosts"field. This makes it unsuitablefor| websites. For more information see the Baseline Requirementsforthe IssuanceandManagement | of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); | specifically, section10.2.3("Information Requirements"). |
查看文件
[root@master ~/cfssl]# tree | . | ├── ca | │ ├── ca.csr | │ ├── ca-key.pem# 根 CA 私鑰(嚴(yán)格保密?。?| │ └── ca.pem#根 CA 證書(公鑰,需分發(fā)給客戶端) | ├── ca-config.json | ├── ca-csr.json | ├── intermediate | │ ├── intermediate.csr | │ ├── intermediate-key.pem# 中間 CA 私鑰(需保密) | │ └── intermediate.pem#中間 CA 證書 | └── intermediate-csr.json |
生成服務(wù)器證書
配置服務(wù)器證書文件
[root@master ~/cfssl]#catserver-csr.json |
{ |
"CN":"*.huangsir-devops.cn", |
"key": { |
"algo":"rsa", |
"size": 2048 |
}, |
"hosts": [ |
"*.huangsir-devops.cn", |
"www.huangsir-devops.cn", |
"api.huangsir-devops.cn", |
"localhost", |
"127.0.0.1", |
"10.37.97.56"|
] |
} |
使用中間CA簽署服務(wù)器證書
[root@master ~/cfssl]# cfssl gencert | -ca=intermediate/intermediate.pem | -ca-key=intermediate/intermediate-key.pem | -config=ca-config.json | -profile=server | server-csr.json| cfssljson -bare server/server | 2025/05/1511:37:29[INFO]generatereceived request | 2025/05/1511:37:29[INFO] received CSR | 2025/05/1511:37:29[INFO] generating key: rsa-2048| 2025/05/1511:37:30[INFO] encoded CSR | 2025/05/1511:37:30[INFO]signedcertificatewithserial number666935063085228543415452828659279667302813819643|
查看生成的文件
[root@master ~/cfssl]# tree | . | ├── ca | │ ├── ca.csr | │ ├── ca-key.pem | │ └── ca.pem | ├── ca-config.json | ├── ca-csr.json | ├── intermediate | │ ├── intermediate.csr | │ ├── intermediate-key.pem | │ └── intermediate.pem | ├── intermediate-csr.json | ├── server | │ ├── server.csr | │ ├── server-key.pem#服務(wù)端私鑰 | │ └── server.pem#服務(wù)端公鑰 | └── server-csr.json |
nginx測(cè)試配置
[root@master /data/nginx]#cat/etc/nginx/conf.d/test1.conf |
server{ |
listen 443 ssl; |
server_name www.huangsir-devops.cn; |
# 配置公鑰證書 |
ssl_certificate /etc/ssl/server/server.pem; |
# 配置私鑰證書 |
ssl_certificate_key /etc/ssl/server/server-key.pem; |
|
# 推薦的 SSL 協(xié)議和加密算法(安全配置) |
ssl_protocols TLSv1.2 TLSv1.3; |
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384ECDHE-ECDSA-CHACHA20-POLY1305ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; |
ssl_prefer_server_ciphers off; |
|
root /data/nginx/; |
location / { |
index index.html; |
} |
} |
|
# http跳轉(zhuǎn)到https |
server { |
listen 80; |
server_name www.huangsir-devops.cn; |
return301 https://www.huangsir-devops.cn$request_uri; |
} |
生成客戶端證書
配置客戶端證書文件
[root@master ~/cfssl]#catclient-csr.json |
{ |
"CN":"client", |
"key": { |
"algo":"rsa", |
"size": 2048 |
} |
} |
使用中間CA簽署客戶端證書
[root@master ~/cfssl]# cfssl gencert | -ca=intermediate/intermediate.pem | -ca-key=intermediate/intermediate-key.pem | -config=ca-config.json | -profile=client | client-csr.json | cfssljson -bare client/client | | # 查看證書 | [root@master ~/cfssl]# tree | . | ├── ca | │ ├── ca-key.pem | │ ├── ca.csr | │ └── ca.pem | ├── ca-config.json | ├── ca-csr.json | ├── client | │ ├── client-key.pem# 公鑰 | │ ├── client.csr | │ └── client.pem# 私鑰證書 | ├── client-csr.json | ├── intermediate | │ ├── intermediate-key.pem | │ ├── intermediate.csr | │ └── intermediate.pem | ├── intermediate-csr.json | ├── server | │ ├── server-key.pem | │ ├── server.csr | │ └── server.pem | └── server-csr.json | | 4 directories, 17 files |
生成K8s證書
K8s證書有很多類型,
生成API Server證書
配置客戶端證書文件
[root@master ~/cfssl]#catk8s-apiserver-csr.json |
{ |
"CN":"kubernetes-apiserver", |
"key": { |
"algo":"rsa", |
"size": 2048 |
}, |
"hosts": [ |
# Kubernetes服務(wù)IP (Service Cluster IP Range) |
"10.0.0.30", |
"10.0.0.31", |
"10.0.0.32"|
# API Server IP |
"192.168.1.10", |
"kubernetes", |
"kubernetes.default", |
"kubernetes.default.svc", |
"kubernetes.default.svc.cluster", |
"kubernetes.default.svc.cluster.local", |
"localhost", |
"127.0.0.1"|
] |
} |
使用中間CA簽署客戶端證書
[root@master ~/cfssl]# cfssl gencert | -ca=intermediate/intermediate.pem | -ca-key=intermediate/intermediate-key.pem | -config=ca-config.json | -profile=kubernetes | k8s-apiserver-csr.json | cfssljson -bare api-server/api-server |
鏈接:https://www.cnblogs.com/huangSir-devops/p/18876361
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
10013瀏覽量
90381 -
開源
+關(guān)注
關(guān)注
3文章
3892瀏覽量
45349 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9562
原文標(biāo)題:cfssl詳解:從入門到精通,手把手教你生成自簽名證書
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
鴻蒙OS開發(fā)指導(dǎo):【應(yīng)用包簽名工具】
驅(qū)動(dòng)程序數(shù)字簽名工具 (制作數(shù)字簽名工具)
在證書存儲(chǔ)區(qū)中找不到清單簽名證書的解決辦法?
HarmonyOS應(yīng)用開發(fā)-生成簽名證書指紋
OpenHarmony應(yīng)用的簽名配置的流程解析
哪個(gè)X.509證書用于NodeMCU SSL連接?
具有身份撤銷功能的無證書簽名方案
基于無證書環(huán)簽名的虛擬機(jī)可信證明方案

自簽名證書工具cfssl詳解
評(píng)論