自签名证书工具cfssl详解
概述
GitHub地址:https://github.com/cloudflare/cfssl
官方地址:https://pkg.cfssl.org
CFSSL(CloudFlare's PKI and TLS toolkit)由 CloudFlare 用go语言开发的一个开源工具,用于证书签名、验证和管理。
生成自签证书的方式有多种,CFSSL支持签发三种类型的证书:client证书、server证书以及集群成员之间的peer证书。推荐使用cfssl工具或者openssl工具来生成,openssl也是开源的证书生成工具。
生成证书基本概念
CA(证书颁发机构)
CA(Certificate Authority)是 PKI(公钥基础设施)体系的核心信任锚点,负责:
- 证书签名:验证申请者身份后,使用自己的私钥为其颁发数字证书。
- 信任分发:通过公开的根证书(Root CA),让客户端信任其签署的所有证书。
- 证书管理:包括证书颁发、更新、撤销和状态查询(OCSP/CRL)。
CA证书类型类型分为三类,分别是:
- 根 CA(Root CA):
自签名证书,位于信任链顶端。
通常离线存储,极少直接签署终端用户证书。 - 中间 CA(Intermediate CA):
由根 CA 签署,用于分担证书签署工作。
即使私钥泄露,影响范围也仅限于其签署的证书。 - 终端 CA:
直接签署服务器 / 客户端证书的 CA。
安全规范实践:
- 分层设计:使用根 CA → 中间 CA → 终端证书的三级结构。
- 私钥保护:根 CA 私钥必须离线存储(如 HSM 硬件安全模块)。
- 定期轮换:中间 CA 证书有效期通常为 3-5 年,需定期更新。
CSR(证书签名请求)
CSR(Certificate Signing Request)是客户端向 CA 提交的申请文件,创建证书前需要先生成 CSR。
CSR文件通常包含以下信息:
- 公钥:申请者生成的公钥。
- 身份信息:如域名、组织名称、国家代码等。
- 扩展字段:如 SAN(Subject Alternative Name)、密钥用途等。
生产CSR的注意事项:
- 私钥绝对保密:CSR 生成过程中产生的私钥需严格保密,不可泄露。
- 信息准确性:CSR 中的域名(CN/SAN)必须与服务器实际域名一致,否则 TLS 握手会失败。
证书配置文件
主要用来定义证书的使用场景、有效期等参数,CFSSL使用 JSON 格式(如 ca-config.json)的证书配置文件
三者工作流程:

Linux安装cfssl工具
cfssl依赖三个工具包,分别是:cfssl、cfssljson、cfss-certinfo
cfssl:cfssl 是工具集的核心,提供了证书生命周期管理的所有功能:
- 证书生成:创建自签名证书、CA 证书和用户证书。
- 证书签名:处理证书签名请求(CSR)并颁发证书。
- 配置管理:使用 JSON 配置文件定义证书策略和使用场景。
- CA 管理:创建和管理证书颁发机构(CA)层次结构。
- OCSP/CRL:生成在线证书状态协议(OCSP)响应和证书撤销列表(CRL)。
cfssljson:专门用于处理 cfssl 输出的 JSON 数据,主要功能包括:
- 解析 JSON 输出:将 cfssl 生成的 JSON 格式证书、密钥和 CSR 转换为单独的文件。
- 文件保存:自动创建并保存证书(.pem)、私钥(.key)和 CSR(.csr)文件。
cfssl-certinfo:用于查看和验证证书的详细信息,功能包括:
- 证书解析:显示证书的元数据(如有效期、颁发者、主题、公钥等)。
- 证书链验证:检查证书的签名链是否有效。
- 格式转换:将证书以人类可读的格式输出。
下载工具
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
授予执行权限
chmod +x /usr/local/bin/cfssl*
cfssl gencert命令详解
cfssl gencert 是 CloudFlare PKI 工具集中用于生成证书签名请求(CSR)和证书的核心命令。
核心参数:
- -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]:指定使用配置文件中的哪个签名策略。对应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 等,默认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-signed server.json
实战:生成证书
创建根CA文件
# 根ca文件,需要将注释去掉
[root@master ~/cfssl]# cat ca-config.json
{
"signing": {
"default": {
# 配置默认证书有效期为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:允许证书用于数字签名。数字签名可以确保数据在传输过程中不被篡改,并且可以验证数据的来源。
- key encipherment:允许证书用于加密密钥。在 TLS 握手过程中,客户端和服务器会交换会话密钥,这个过程通常使用证书进行加密。
- server auth:专门用于服务器身份验证。当客户端连接到服务器时,服务器会出示自己的证书,客户端会验证这个证书是否由信任的 CA 颁发,以及证书中的域名是否与自己要访问的域名一致。
- client auth:专门用于客户端身份验证。在双向 TLS 中,服务器也会要求客户端提供证书,以验证客户端的身份。
各端证书使用场景:
- server:HTTPS 网站、SMTP、IMAP、POP3 等邮件服务器、VPN 服务器、任何需要向客户端证明自己身份的服务
- client:企业内部应用,要求员工使用客户端证书登录、API 访问,使用客户端证书进行身份验证、安全邮件客户端,使用证书进行身份验证
- peer:区块链网络中的节点通信、分布式系统中节点间的安全通信、金融机构之间的安全数据交换
- kubernetes:Kubernetes 组件证书(如 API Server、etcd)。
- ca:中间 CA 证书(需配合 -ca 参数使用)。
创建根 CA CSR 配置文件
# 定义CSR文件,需要将json文件中的注释去掉
[root@master ~/cfssl]# cat ca-csr.json
{
# 根 CA 的通用名称,对于服务器证书,CN 通常是域名(如www.example.com);
# 对于 CA 证书,CN 是 CA 的标识名称。
"CN": "My Root CA",
"key": {
# 加密算法
"algo": "rsa",
# 密钥长度
"size": 4096
},
"names": [
{
# 国家代码,CN代表是中国
"C": "CN",
# 省份
"ST": "Beijing",
# 城市或地区
"L": "Beijing",
# 组织名称(Organization),可以理解成公司名称
"O": "rootca",
# 组织单位(Organizational Unit),可以理解成公司部门
"OU": "ca"
}
],
# 根 CA 证书的配置,指定有效期为10年
"ca": {
"expiry": "87600h"
}
}
生成根 CA 证书和私钥
[root@master ~/cfssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca/ca
2025/05/15 11:23:34 [INFO] generating a new CA key and certificate from CSR
2025/05/15 11:23:34 [INFO] generate received request
2025/05/15 11:23:34 [INFO] received CSR
2025/05/15 11:23:34 [INFO] generating key: rsa-4096
2025/05/15 11:23:34 [INFO] encoded CSR
2025/05/15 11:23:34 [INFO] signed certificate with serial number 492661591325776778969123330542788728689689366584
命令解释:
cfssl gencert:cfssl 工具的子命令,用于生成证书
-initca:指定生成自签名的根 CA 证书
ca-csr.json:证书签名请求(CSR)的配置文件路径,对应上面创建的 ca-csr.json
cfssljson:处理 cfssl 生成的 JSON 输出并转换为文件
-bare ca:指定输出文件名前缀为 ca,会生成以下三个文件:
ca.pem:根 CA 证书(自签名)
ca-key.pem:根 CA 的私钥(必须严格保密!)
ca.csr:证书签名请求(通常自签名 CA 不需要保留此文件)
查看当前的目录:
[root@master ~/cfssl]# tree
.
├── ca
│ ├── ca.csr
│ ├── ca-key.pem # 根 CA 私钥(严格保密!)
│ └── ca.pem #根 CA 证书(公钥,需分发给客户端)
├── ca-config.json
├── ca-csr.json
生成中间CA证书和私钥
中间CA证书文件
[root@master ~/cfssl]# cat intermediate-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/15 11:29:49 [INFO] generate received request
2025/05/15 11:29:49 [INFO] received CSR
2025/05/15 11:29:49 [INFO] generating key: rsa-4096
2025/05/15 11:29:49 [INFO] encoded CSR
2025/05/15 11:29:49 [INFO] signed certificate with serial number 722124812765078011706922545691404003361157472292
2025/05/15 11:29:49 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
查看文件
[root@master ~/cfssl]# tree
.
├── ca
│ ├── ca.csr
│ ├── ca-key.pem # 根 CA 私钥(严格保密!)
│ └── ca.pem #根 CA 证书(公钥,需分发给客户端)
├── ca-config.json
├── ca-csr.json
├── intermediate
│ ├── intermediate.csr
│ ├── intermediate-key.pem # 中间 CA 私钥(需保密)
│ └── intermediate.pem #中间 CA 证书
└── intermediate-csr.json
生成服务器证书
配置服务器证书文件
[root@master ~/cfssl]# cat server-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签署服务器证书
[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/15 11:37:29 [INFO] generate received request
2025/05/15 11:37:29 [INFO] received CSR
2025/05/15 11:37:29 [INFO] generating key: rsa-2048
2025/05/15 11:37:30 [INFO] encoded CSR
2025/05/15 11:37:30 [INFO] signed certificate with serial number 666935063085228543415452828659279667302813819643
查看生成的文件
[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 #服务端私钥
│ └── server.pem #服务端公钥
└── 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 协议和加密算法(安全配置)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
root /data/nginx/;
location / {
index index.html;
}
}
# http跳转到https
server {
listen 80;
server_name www.huangsir-devops.cn;
return 301 https://www.huangsir-devops.cn$request_uri;
}
生成客户端证书
配置客户端证书文件
[root@master ~/cfssl]# cat client-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]# cat k8s-apiserver-csr.json
{
"CN": "kubernetes-apiserver",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
# Kubernetes服务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
持续更新中
自签名证书工具cfssl详解的更多相关文章
- Linux命令工具 top详解
Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...
- Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区
Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区 Lua包管理工具Luarocks详解
- [转]网络性能评估工具Iperf详解(可测丢包率)
原文链接:安全运维之:网络性能评估工具Iperf详解:http://os.51cto.com/art/201410/454889.htm 参考博文:http://linoxide.com/monito ...
- IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...
- IE8“开发人员工具”使用详解上(各级菜单详解)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- 批量执行工具PSSH详解
批量执行工具PSSH详解 pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,使用必须在各个服务器上配置好密钥认证访问. 安装pssh包 yum 安 ...
- 自动化运维工具——ansile详解
自动化运维工具——ansible详解(一) 目录 ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- (总结)Linux下的暴力密码在线破解工具Hydra详解
(总结)Linux下的暴力密码在线破解工具Hydra详解 学习了:https://blog.csdn.net/yafeichang/article/details/53502869
随机推荐
- Golang 入门 : Go语言的设计哲学
前言 设计哲学之于编程语言,就好比一个人的价值观之于这个人的行为. 因为如果你不认同一个人的价值观,那你其实很难与之持续交往下去,即所谓道不同不相为谋.类似的,如果你不认同一门编程语言的设计哲学,那么 ...
- 我觉得 AI 你过分了!
大家好,我是程序员鱼皮.创业之后,头发掉的厉害,已经记不清自己头发茂密如林的时候了... 正好最近 AI 工具 Gemini 新出了原生多模态生图功能,于是便想借助 AI 来生成一张 "鱼皮 ...
- 通过 openpyxl 操作 excel 表格
博客地址:https://www.cnblogs.com/zylyehuo/ STEP1: 导入相关库 import os from openpyxl import load_workbook STE ...
- MySQL-删除数据和count(*)原理
delete删除数据原理 在InndoDB存储引擎中,delete删除操作是把需要删除的数据或者页标记为已删除,后面如果有需要,直接复用即可.这些被标记为已经删除的数据,看起来就像空洞一样.所以看起来 ...
- JLabel展示文本和图片--java进阶day03
1.JLabel 我们想要在窗体中展示图片或者文本是不能直接展示的,文本和图片必须要放在JLabel这个组件中 JLabel实质是窗体中的一块区域,创建了一个JLabel对象意味着在窗体中开辟了一块区 ...
- 《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统
<机器人SLAM导航核心技术与实战>第1季:第8章_激光SLAM系统 视频讲解 [第1季]8.第8章_激光SLAM系统-视频讲解 [第1季]8.1.第8章_激光SLAM系统_Gmappin ...
- MYSQL数据库 MariaDB断电恢复总结
背景:本次是机房异常断电,导致数据库文件损坏.在数据库自启动之后频繁宕机,在多次尝试以后,总结了一下几种方法,及供参考. 1.mariadb服务器断电重启之后Missing MLOG_CHECKPOI ...
- Python科学计算系列11—几何绘图
1.显函数图像绘制 例:绘制y=sinx的图像 代码如下: from sympy import * x = symbols('x') plot(sin(x), (x, -2 * pi, 2 * pi) ...
- H5 ios端底部安全距离CSS
html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...
- 校验获取数据或者返回值的方法,should contain的用法
如上图,验证"首页"是否添加成功,我们就通过验证页面上是否存在"首页"这个关键字,来确认数据是否添加成功 RB的写法如上图,原理是以文本输出"首页&q ...