自簽名證書(shū)工具cfssl詳解
概述
GitHub地址:https://github.com/cloudflare/cfssl
官方地址:https://pkg.cfssl.org
CFSSL(CloudFlare's PKI and TLS toolkit)由 CloudFlare 用go語(yǔ)言開(kāi)發(fā)的一個(gè)開(kāi)源工具,用于證書(shū)簽名、驗(yàn)證和管理。
生成自簽證書(shū)的方式有多種,CFSSL支持簽發(fā)三種類(lèi)型的證書(shū):?client證書(shū)、?server證書(shū)以及集群成員之間的peer證書(shū)。推薦使用cfssl工具或者openssl工具來(lái)生成,openssl也是開(kāi)源的證書(shū)生成工具。
生成證書(shū)基本概念
CA(證書(shū)頒發(fā)機(jī)構(gòu))
CA(Certificate Authority)是 PKI(公鑰基礎(chǔ)設(shè)施)體系的核心信任錨點(diǎn),負(fù)責(zé):
? 證書(shū)簽名:驗(yàn)證申請(qǐng)者身份后,使用自己的私鑰為其頒發(fā)數(shù)字證書(shū)。
? 信任分發(fā):通過(guò)公開(kāi)的根證書(shū)(Root CA),讓客戶(hù)端信任其簽署的所有證書(shū)。
? 證書(shū)管理:包括證書(shū)頒發(fā)、更新、撤銷(xiāo)和狀態(tài)查詢(xún)(OCSP/CRL)。
CA證書(shū)類(lèi)型類(lèi)型分為三類(lèi),分別是:
? 根 CA(Root CA):
自簽名證書(shū),位于信任鏈頂端。
通常離線存儲(chǔ),極少直接簽署終端用戶(hù)證書(shū)。
? 中間 CA(Intermediate CA):
由根 CA 簽署,用于分擔(dān)證書(shū)簽署工作。
即使私鑰泄露,影響范圍也僅限于其簽署的證書(shū)。
? 終端 CA:
直接簽署服務(wù)器 / 客戶(hù)端證書(shū)的 CA。
安全規(guī)范實(shí)踐:
? 分層設(shè)計(jì):使用根 CA → 中間 CA → 終端證書(shū)的三級(jí)結(jié)構(gòu)。
? 私鑰保護(hù):根 CA 私鑰必須離線存儲(chǔ)(如 HSM 硬件安全模塊)。
? 定期輪換:中間 CA 證書(shū)有效期通常為 3-5 年,需定期更新。
CSR(證書(shū)簽名請(qǐng)求)
CSR(Certificate Signing Request)是客戶(hù)端向 CA 提交的申請(qǐng)文件,創(chuàng)建證書(shū)前需要先生成 CSR。
CSR文件通常包含以下信息:
? 公鑰:申請(qǐng)者生成的公鑰。
? 身份信息:如域名、組織名稱(chēng)、國(guó)家代碼等。
? 擴(kuò)展字段:如 SAN(Subject Alternative Name)、密鑰用途等。
生產(chǎn)CSR的注意事項(xiàng):
? 私鑰絕對(duì)保密:CSR 生成過(guò)程中產(chǎn)生的私鑰需嚴(yán)格保密,不可泄露。
? 信息準(zhǔn)確性:CSR 中的域名(CN/SAN)必須與服務(wù)器實(shí)際域名一致,否則 TLS 握手會(huì)失敗。
證書(shū)配置文件
主要用來(lái)定義證書(shū)的使用場(chǎng)景、有效期等參數(shù),CFSSL使用 JSON 格式(如 ca-config.json)的證書(shū)配置文件
三者工作流程: image
Linux安裝cfssl工具
cfssl依賴(lài)三個(gè)工具包,分別是:cfssl、cfssljson、cfss-certinfo
? cfssl:cfssl 是工具集的核心,提供了證書(shū)生命周期管理的所有功能:
? 證書(shū)生成:創(chuàng)建自簽名證書(shū)、CA 證書(shū)和用戶(hù)證書(shū)。
? 證書(shū)簽名:處理證書(shū)簽名請(qǐng)求(CSR)并頒發(fā)證書(shū)。
? 配置管理:使用 JSON 配置文件定義證書(shū)策略和使用場(chǎng)景。
? CA 管理:創(chuàng)建和管理證書(shū)頒發(fā)機(jī)構(gòu)(CA)層次結(jié)構(gòu)。
? OCSP/CRL:生成在線證書(shū)狀態(tài)協(xié)議(OCSP)響應(yīng)和證書(shū)撤銷(xiāo)列表(CRL)。
? cfssljson:專(zhuān)門(mén)用于處理 cfssl 輸出的 JSON 數(shù)據(jù),主要功能包括:
? 解析 JSON 輸出:將 cfssl 生成的 JSON 格式證書(shū)、密鑰和 CSR 轉(zhuǎn)換為單獨(dú)的文件。
? 文件保存:自動(dòng)創(chuàng)建并保存證書(shū)(.pem)、私鑰(.key)和 CSR(.csr)文件。
? cfssl-certinfo:用于查看和驗(yàn)證證書(shū)的詳細(xì)信息,功能包括:
? 證書(shū)解析:顯示證書(shū)的元數(shù)據(jù)(如有效期、頒發(fā)者、主題、公鑰等)。
? 證書(shū)鏈驗(yàn)證:檢查證書(shū)的簽名鏈?zhǔn)欠裼行А?/p>
? 格式轉(zhuǎn)換:將證書(shū)以人類(lèi)可讀的格式輸出。
下載工具
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 工具集中用于生成證書(shū)簽名請(qǐng)求(CSR)和證書(shū)的核心命令。
核心參數(shù):
? -ca [path]:指定用于簽名的 CA 證書(shū)文件路徑(PEM 格式)。
示例:-ca=ca.pem |
? -ca-key [path]:指定 CA 的私鑰文件路徑(PEM 格式)。
示例:-ca-key=ca-key.pem |
? -config [path]:指定證書(shū)簽名配置文件(JSON 格式),定義證書(shū)的有效期、用途等策略。
示例:-config=ca-config.json| |
? -profile [name]:指定使用配置文件中的哪個(gè)簽名策略。對(duì)應(yīng)CA配置文件中的profiles字段,其值可以為server、client、peer、ca、kubernets等
示例:-profile=server |
? -hostname [list]:指定證書(shū)的 Subject Alternative Name (SAN) 字段,包含域名和 IP 地址,多個(gè)值用逗號(hào)分隔
示例:-hostname=example.com,www.example.com,192.168.1.1 |
? -cn [name]:指定證書(shū)的 Common Name (CN)
示例:-cn="My Server"|
? -key-algo [algo]:指定密鑰算法,支持 rsa、ecdsa 等,默認(rèn)rsa
示例:-key-algo=rsa |
? -key-size [bits]:指定密鑰長(zhǎng)度(RSA 建議 2048+,ECDSA 建議 256+)
示例:-key-size=2048|
? -initca:生成自簽名的根 CA 證書(shū)。
示例:cfssl gencert -initca ca-csr.json| |
? -self-signed:生成自簽名證書(shū)(非 CA 證書(shū))
示例:cfssl gencert -self-signedserver.json |
實(shí)戰(zhàn):生成證書(shū)
創(chuàng)建根CA文件
# 根ca文件,需要將注釋去掉 | [root@master ~/cfssl]#catca-config.json | { | "signing": { | "default": { | # 配置默認(rèn)證書(shū)有效期為10年,通常用于根CA證書(shū) | "expiry":"87600h"| }, | "profiles": { | # 定義server端的證書(shū) | "server": { | # 1年有效期 | "expiry":"8760h", | "usages": ["signing","key encipherment","server auth"] | }, | # 定義client端的證書(shū),有效期為一年 | "client": { | "expiry":"8760h", | "usages": ["signing","key encipherment","client auth"] | }, | # 定義peer端的證書(shū),有效期為一年 | "peer": { | "expiry":"8760h", | "usages": ["signing","key encipherment","server auth","client auth"] | }, | # 定義kubernetes的證書(shū),有效期為一年 | "kubernetes": { | "expiry":"8760h", | "usages": ["signing","key encipherment","server auth","client auth"] | }, | # 定義ca的證書(shū),有效期為五年 | "ca": { | "expiry":"43800h", | "usages": ["signing","key encipherment","server auth","client auth"] | } | } | } | } |
配置文件字段說(shuō)明:
usages:指定的證書(shū)用途
? signing:允許證書(shū)用于數(shù)字簽名。數(shù)字簽名可以確保數(shù)據(jù)在傳輸過(guò)程中不被篡改,并且可以驗(yàn)證數(shù)據(jù)的來(lái)源。
? key encipherment:允許證書(shū)用于加密密鑰。在 TLS 握手過(guò)程中,客戶(hù)端和服務(wù)器會(huì)交換會(huì)話密鑰,這個(gè)過(guò)程通常使用證書(shū)進(jìn)行加密。
? server auth:專(zhuān)門(mén)用于服務(wù)器身份驗(yàn)證。當(dāng)客戶(hù)端連接到服務(wù)器時(shí),服務(wù)器會(huì)出示自己的證書(shū),客戶(hù)端會(huì)驗(yàn)證這個(gè)證書(shū)是否由信任的 CA 頒發(fā),以及證書(shū)中的域名是否與自己要訪問(wèn)的域名一致。
? client auth:專(zhuān)門(mén)用于客戶(hù)端身份驗(yàn)證。在雙向 TLS 中,服務(wù)器也會(huì)要求客戶(hù)端提供證書(shū),以驗(yàn)證客戶(hù)端的身份。
各端證書(shū)使用場(chǎng)景:
? server:HTTPS 網(wǎng)站、SMTP、IMAP、POP3 等郵件服務(wù)器、VPN 服務(wù)器、任何需要向客戶(hù)端證明自己身份的服務(wù)
? client:企業(yè)內(nèi)部應(yīng)用,要求員工使用客戶(hù)端證書(shū)登錄、API 訪問(wèn),使用客戶(hù)端證書(shū)進(jìn)行身份驗(yàn)證、安全郵件客戶(hù)端,使用證書(shū)進(jìn)行身份驗(yàn)證
? peer:區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點(diǎn)通信、分布式系統(tǒng)中節(jié)點(diǎn)間的安全通信、金融機(jī)構(gòu)之間的安全數(shù)據(jù)交換
? kubernetes:Kubernetes 組件證書(shū)(如 API Server、etcd)。
? ca:中間 CA 證書(shū)(需配合 -ca 參數(shù)使用)。
創(chuàng)建根 CA CSR 配置文件
# 定義CSR文件,需要將json文件中的注釋去掉 | [root@master ~/cfssl]#catca-csr.json | { | # 根 CA 的通用名稱(chēng),對(duì)于服務(wù)器證書(shū),CN 通常是域名(如www.example.com); | # 對(duì)于 CA 證書(shū),CN 是 CA 的標(biāo)識(shí)名稱(chēng)。 | "CN":"My Root CA", | "key": { | # 加密算法 | "algo":"rsa", | # 密鑰長(zhǎng)度 | "size": 4096 | }, | "names": [ | { | # 國(guó)家代碼,CN代表是中國(guó) | "C":"CN", | # 省份 | "ST":"Beijing", | # 城市或地區(qū) | "L":"Beijing", | # 組織名稱(chēng)(Organization),可以理解成公司名稱(chēng) | "O":"rootca", | # 組織單位(Organizational Unit),可以理解成公司部門(mén) | "OU":"ca"| } | ], | # 根 CA 證書(shū)的配置,指定有效期為10年 | "ca": { | "expiry":"87600h"| } | } |
生成根 CA 證書(shū)和私鑰
[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|
命令解釋?zhuān)?/p>
cfssl gencert:cfssl 工具的子命令,用于生成證書(shū)| -initca:指定生成自簽名的根 CA 證書(shū) | ca-csr.json:證書(shū)簽名請(qǐng)求(CSR)的配置文件路徑,對(duì)應(yīng)上面創(chuàng)建的ca-csr.json| | cfssljson:處理 cfssl 生成的JSON輸出并轉(zhuǎn)換為文件| -bare ca:指定輸出文件名前綴為 ca,會(huì)生成以下三個(gè)文件: | ca.pem:根 CA 證書(shū)(自簽名)| ca-key.pem:根 CA 的私鑰(必須嚴(yán)格保密?。?| ca.csr:證書(shū)簽名請(qǐng)求(通常自簽名 CA 不需要保留此文件)|
查看當(dāng)前的目錄:
[root@master ~/cfssl]# tree | . | ├── ca | │ ├── ca.csr | │ ├── ca-key.pem# 根 CA 私鑰(嚴(yán)格保密?。?| │ └── ca.pem#根 CA 證書(shū)(公鑰,需分發(fā)給客戶(hù)端) | ├── ca-config.json | ├── ca-csr.json |
生成中間CA證書(shū)和私鑰
中間CA證書(shū)文件
[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 證書(shū)和私鑰
[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 證書(shū)(公鑰,需分發(fā)給客戶(hù)端) | ├── ca-config.json | ├── ca-csr.json | ├── intermediate | │ ├── intermediate.csr | │ ├── intermediate-key.pem# 中間 CA 私鑰(需保密) | │ └── intermediate.pem#中間 CA 證書(shū) | └── intermediate-csr.json |
生成服務(wù)器證書(shū)
配置服務(wù)器證書(shū)文件
[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ù)器證書(shū)
[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; | # 配置公鑰證書(shū) | ssl_certificate /etc/ssl/server/server.pem; | # 配置私鑰證書(shū) | 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; | } |
生成客戶(hù)端證書(shū)
配置客戶(hù)端證書(shū)文件
[root@master ~/cfssl]#catclient-csr.json | { | "CN":"client", | "key": { | "algo":"rsa", | "size": 2048 | } | } |
使用中間CA簽署客戶(hù)端證書(shū)
[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 | | # 查看證書(shū) | [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# 私鑰證書(shū) | ├── 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證書(shū)
K8s證書(shū)有很多類(lèi)型,
生成API Server證書(shū)
配置客戶(hù)端證書(shū)文件
[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簽署客戶(hù)端證書(shū)
[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文章
9793瀏覽量
87947 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3680瀏覽量
43818 -
go語(yǔ)言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9370
原文標(biāo)題:cfssl詳解:從入門(mén)到精通,手把手教你生成自簽名證書(shū)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
鴻蒙OS開(kāi)發(fā)指導(dǎo):【應(yīng)用包簽名工具】

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

評(píng)論