0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

自签名证书工具cfssl详解

马哥Linux运维 来源:博客园 2025-06-11 16:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

自签名证书工具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)的证书配置文件

三者工作流程: 4a4fde70-44d1-11f0-b715-92fbcf53809c.pngimage

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-signedserver.json |

实战:生成证书

创建根CA文件

# 根ca文件,需要将注释去掉 |
[root@master ~/cfssl]#catca-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]#catca-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]#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)的配置文件路径,对应上面创建的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]#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 私钥(严格保密!) |
│  └── 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]#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签署服务器证书

[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#服务端私钥 |
│  └── 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-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跳转到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服务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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10097

    浏览量

    90906
  • 开源
    +关注

    关注

    3

    文章

    4039

    浏览量

    45579
  • go语言
    +关注

    关注

    1

    文章

    159

    浏览量

    9630

原文标题:cfssl详解:从入门到精通,手把手教你生成自签名证书

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    鸿蒙OS开发指导:【应用包签名工具

    OpenHarmony系统内置密钥库文件,文件名称为OpenHarmony.p12,内含根CA证书、中间CA证书、最终实体证书等信息,工具基于该密钥库文件对OpenHarmony应用进
    的头像 发表于 04-17 11:13 1973次阅读
    鸿蒙OS开发指导:【应用包<b class='flag-5'>签名</b><b class='flag-5'>工具</b>】

    驱动程序数字签名工具 (制作数字签名工具)

    驱动程序数字签名工具1.3 build 1022中文绿色版(制作数字签名工具) 新一代的驱动程序数字签名
    发表于 10-24 13:35

    证书存储区中找不到清单签名证书的解决办法?

    在做一些C#软件二次开辟或点窜时,打开原有的代码会报错: 在证书存储区中找不到清单签名证书。这个时辰要怎么处置呢?其实很简单,这个证书签名对程序运行并没有影响,直接将其打消不查抄即可。
    发表于 11-06 08:03

    HarmonyOS应用开发-生成签名证书指纹

    创建应用程序的签名证书。2.当前PC已经安装JDK。操作步骤如下:1.执行CMD命令打开命令行工具,执行cd命令进入keytool.exe所在的目录(以下样例为JDK安装在C盘的Program
    发表于 01-11 10:39

    OpenHarmony应用的签名配置的流程解析

    ,具体请访问HUAWEI DevEco Studio使用指南 (opens new window)。配置应用签名信息的流程如下图所示。   生成密钥和证书请求文件  OpenHarmony应用通过数字证书
    发表于 03-14 16:40

    哪个X.509证书用于NodeMCU SSL连接?

    我正在使用 NodeMCU 通过 MQTT 协议安全地连接到 Microsoft Azure IoT Hub。 Microsoft 提供使用签名 X.509 证书授权客户端的功能。 这在这里详细
    发表于 04-27 07:39

    具有身份撤销功能的无证书签名方案

    讨论密码方案中的身份撤销问题。对JKLLC签名方案进行了安全性分析,指出该方案实际上不具有身份撤销功能。对该方案加以改进,以双线性对为工具给出一种新的无证书签名方案并
    发表于 04-13 09:35 11次下载

    证书签名方案

    证书签名方案:将盲签名和无证书密码结合,充分利用二者的优势,提出了一种无证书签名方案,使得
    发表于 10-21 07:57 14次下载

    基于无证书签名的虚拟机可信证明方案

    由于虚拟环境的复杂性和动态性,使用传统方法证明其安全状态时会出现运算效率低下的情况;而环签名具有运算效率高、匿名性强的特点,利用无证书公钥系统可解决密钥管理问题。为此,提出一种采用无证书签名
    发表于 12-06 17:10 0次下载
    基于无<b class='flag-5'>证书</b>环<b class='flag-5'>签名</b>的虚拟机可信证明方案

    你还在使用签名SSL证书吗?小心这些漏洞

    有一些公司或者个人出于成本的考虑,会选择使用签名SSL证书,即不受信任的任意机构或个人,使用工具自己签发的SSL证书。这绝对是得不偿失的重
    的头像 发表于 07-02 11:29 4849次阅读

    虚拟机:Linux生成签名SSL证书

    虚拟机:Linux生成签名SSL证书
    的头像 发表于 07-02 16:34 5352次阅读

    签名工作室工具

    签名工作室工具
    发表于 04-16 20:38 3次下载
    <b class='flag-5'>签名</b>工作室<b class='flag-5'>工具</b>箱

    一种可证安全高效的无证书签名方案

    在无证书密码学体制中,公钥与持有者之间没有认证关系,可能产生恶意用户替换用户公钥的问题。为此,对无证书签名定义进行改进,提出一种可证安全的无证书签名方案。方案的安全性基于Iv-CDH
    发表于 06-21 16:00 5次下载

    CFSSL PKI工具

    ./oschina_soft/cfssl.zip
    发表于 05-10 14:19 1次下载
    <b class='flag-5'>CFSSL</b> PKI<b class='flag-5'>工具</b>包

    在linux系统通过OpenSSL工具签https证书

    工具介绍 OpenSSL是SSL/TLS协议的实现工具 key是私钥文件,用于对发送给客户端的数据加密,以及对从客户端接收的数据进行解密。 csr是证书签名请求文件,用于提交给证书颁发
    的头像 发表于 12-09 13:53 1985次阅读