自簽名證書工具cfssl詳解
概述
GitHub地址:https://github.com/cloudflare/cfssl
官方地址:https://pkg.cfssl.org
CFSSL(CloudFlare's PKI and TLS toolkit)由 CloudFlare 用go語言開發(fā)的一個開源工具,用于證書簽名、驗證和管理。
生成自簽證書的方式有多種,CFSSL支持簽發(fā)三種類型的證書:?client證書、?server證書以及集群成員之間的peer證書。推薦使用cfssl工具或者openssl工具來生成,openssl也是開源的證書生成工具。
生成證書基本概念
CA(證書頒發(fā)機(jī)構(gòu))
CA(Certificate Authority)是 PKI(公鑰基礎(chǔ)設(shè)施)體系的核心信任錨點,負(fù)責(zé):
? 證書簽名:驗證申請者身份后,使用自己的私鑰為其頒發(fā)數(shù)字證書。
? 信任分發(fā):通過公開的根證書(Root CA),讓客戶端信任其簽署的所有證書。
? 證書管理:包括證書頒發(fā)、更新、撤銷和狀態(tài)查詢(OCSP/CRL)。
CA證書類型類型分為三類,分別是:
? 根 CA(Root CA):
自簽名證書,位于信任鏈頂端。
通常離線存儲,極少直接簽署終端用戶證書。
? 中間 CA(Intermediate CA):
由根 CA 簽署,用于分擔(dān)證書簽署工作。
即使私鑰泄露,影響范圍也僅限于其簽署的證書。
? 終端 CA:
直接簽署服務(wù)器 / 客戶端證書的 CA。
安全規(guī)范實踐:
? 分層設(shè)計:使用根 CA → 中間 CA → 終端證書的三級結(jié)構(gòu)。
? 私鑰保護(hù):根 CA 私鑰必須離線存儲(如 HSM 硬件安全模塊)。
? 定期輪換:中間 CA 證書有效期通常為 3-5 年,需定期更新。
CSR(證書簽名請求)
CSR(Certificate Signing Request)是客戶端向 CA 提交的申請文件,創(chuàng)建證書前需要先生成 CSR。
CSR文件通常包含以下信息:
? 公鑰:申請者生成的公鑰。
? 身份信息:如域名、組織名稱、國家代碼等。
? 擴(kuò)展字段:如 SAN(Subject Alternative Name)、密鑰用途等。
生產(chǎn)CSR的注意事項:
? 私鑰絕對保密:CSR 生成過程中產(chǎn)生的私鑰需嚴(yán)格保密,不可泄露。
? 信息準(zhǔn)確性:CSR 中的域名(CN/SAN)必須與服務(wù)器實際域名一致,否則 TLS 握手會失敗。
證書配置文件
主要用來定義證書的使用場景、有效期等參數(shù),CFSSL使用 JSON 格式(如 ca-config.json)的證書配置文件
三者工作流程: image
Linux安裝cfssl工具
cfssl依賴三個工具包,分別是:cfssl、cfssljson、cfss-certinfo
? cfssl:cfssl 是工具集的核心,提供了證書生命周期管理的所有功能:
? 證書生成:創(chuàng)建自簽名證書、CA 證書和用戶證書。
? 證書簽名:處理證書簽名請求(CSR)并頒發(fā)證書。
? 配置管理:使用 JSON 配置文件定義證書策略和使用場景。
? 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)換為單獨的文件。
? 文件保存:自動創(chuàng)建并保存證書(.pem)、私鑰(.key)和 CSR(.csr)文件。
? cfssl-certinfo:用于查看和驗證證書的詳細(xì)信息,功能包括:
? 證書解析:顯示證書的元數(shù)據(jù)(如有效期、頒發(fā)者、主題、公鑰等)。
? 證書鏈驗證:檢查證書的簽名鏈?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 工具集中用于生成證書簽名請求(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]:指定使用配置文件中的哪個簽名策略。對應(yīng)CA配置文件中的profiles字段,其值可以為server、client、peer、ca、kubernets等
示例:-profile=server |
? -hostname [list]:指定證書的 Subject Alternative Name (SAN) 字段,包含域名和 IP 地址,多個值用逗號分隔
示例:-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 |
實戰(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ù)在傳輸過程中不被篡改,并且可以驗證數(shù)據(jù)的來源。
? key encipherment:允許證書用于加密密鑰。在 TLS 握手過程中,客戶端和服務(wù)器會交換會話密鑰,這個過程通常使用證書進(jìn)行加密。
? server auth:專門用于服務(wù)器身份驗證。當(dāng)客戶端連接到服務(wù)器時,服務(wù)器會出示自己的證書,客戶端會驗證這個證書是否由信任的 CA 頒發(fā),以及證書中的域名是否與自己要訪問的域名一致。
? client auth:專門用于客戶端身份驗證。在雙向 TLS 中,服務(wù)器也會要求客戶端提供證書,以驗證客戶端的身份。
各端證書使用場景:
? server:HTTPS 網(wǎng)站、SMTP、IMAP、POP3 等郵件服務(wù)器、VPN 服務(wù)器、任何需要向客戶端證明自己身份的服務(wù)
? client:企業(yè)內(nèi)部應(yīng)用,要求員工使用客戶端證書登錄、API 訪問,使用客戶端證書進(jìn)行身份驗證、安全郵件客戶端,使用證書進(jìn)行身份驗證
? peer:區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點通信、分布式系統(tǒng)中節(jié)點間的安全通信、金融機(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 的通用名稱,對于服務(wù)器證書,CN 通常是域名(如www.example.com); | # 對于 CA 證書,CN 是 CA 的標(biāo)識名稱。 | "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:證書簽名請求(CSR)的配置文件路徑,對應(yīng)上面創(chuàng)建的ca-csr.json| | cfssljson:處理 cfssl 生成的JSON輸出并轉(zhuǎn)換為文件| -bare ca:指定輸出文件名前綴為 ca,會生成以下三個文件: | ca.pem:根 CA 證書(自簽名)| ca-key.pem:根 CA 的私鑰(必須嚴(yán)格保密!) | ca.csr:證書簽名請求(通常自簽名 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測試配置
[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文章
9716瀏覽量
87357 -
開源
+關(guān)注
關(guān)注
3文章
3622瀏覽量
43520 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9294
原文標(biāo)題:cfssl詳解:從入門到精通,手把手教你生成自簽名證書
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
鴻蒙OS開發(fā)指導(dǎo):【應(yīng)用包簽名工具】

驅(qū)動程序數(shù)字簽名工具 (制作數(shù)字簽名工具)
在證書存儲區(qū)中找不到清單簽名證書的解決辦法?
HarmonyOS應(yīng)用開發(fā)-生成簽名證書指紋
OpenHarmony應(yīng)用的簽名配置的流程解析
哪個X.509證書用于NodeMCU SSL連接?
具有身份撤銷功能的無證書簽名方案
基于無證書環(huán)簽名的虛擬機(jī)可信證明方案

評論