找回密码
 立即注册
首页 业界区 业界 自签名证书工具cfssl详解

自签名证书工具cfssl详解

啤愿 昨天 13:39
概述

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)的证书配置文件
三者工作流程:
1.png

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:用于查看和验证证书的详细信息,功能包括:

    • 证书解析:显示证书的元数据(如有效期、颁发者、主题、公钥等)。
    • 证书链验证:检查证书的签名链是否有效。
    • 格式转换:将证书以人类可读的格式输出。

下载工具
  1. curl -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  2. curl -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  3. curl -L -o /usr/local/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
复制代码
授予执行权限
  1. chmod +x /usr/local/bin/cfssl*
复制代码
cfssl gencert命令详解

cfssl gencert 是 CloudFlare PKI 工具集中用于生成证书签名请求(CSR)和证书的核心命令。
核心参数:


  • -ca [path]:指定用于签名的 CA 证书文件路径(PEM 格式)。
  1. 示例:-ca=ca.pem
复制代码

  • -ca-key [path]:指定 CA 的私钥文件路径(PEM 格式)。
  1. 示例:-ca-key=ca-key.pem
复制代码

  • -config [path]:指定证书签名配置文件(JSON 格式),定义证书的有效期、用途等策略。
  1. 示例:-config=ca-config.json
复制代码

  • -profile [name]:指定使用配置文件中的哪个签名策略。对应CA配置文件中的profiles字段,其值可以为server、client、peer、ca、kubernets等
  1. 示例:-profile=server
复制代码

  • -hostname
      :指定证书的 Subject Alternative Name (SAN) 字段,包含域名和 IP 地址,多个值用逗号分隔
    1. 示例:-hostname=example.com,www.example.com,192.168.1.1
    复制代码

    • -cn [name]:指定证书的 Common Name (CN)
    1. 示例:-cn="My Server"
    复制代码

    • -key-algo [algo]:指定密钥算法,支持 rsa、ecdsa 等,默认rsa
    1. 示例:-key-algo=rsa
    复制代码

    • -key-size [bits]:指定密钥长度(RSA 建议 2048+,ECDSA 建议 256+)
    1. 示例:-key-size=2048
    复制代码

    • -initca:生成自签名的根 CA 证书。
    1. 示例:cfssl gencert -initca ca-csr.json
    复制代码

    • -self-signed:生成自签名证书(非 CA 证书)
    1. 示例:cfssl gencert -self-signed server.json
    复制代码
    实战:生成证书

    创建根CA文件
    1. # 根ca文件,需要将注释去掉
    2. [root@master ~/cfssl]# cat ca-config.json
    3. {
    4.   "signing": {
    5.     "default": {
    6.        # 配置默认证书有效期为10年,通常用于根CA证书
    7.       "expiry": "87600h"
    8.     },
    9.     "profiles": {
    10.       # 定义server端的证书
    11.       "server": {
    12.         # 1年有效期
    13.         "expiry": "8760h",
    14.         "usages": ["signing", "key encipherment", "server auth"]
    15.       },
    16.       # 定义client端的证书,有效期为一年
    17.       "client": {
    18.         "expiry": "8760h",
    19.         "usages": ["signing", "key encipherment", "client auth"]
    20.       },
    21.       # 定义peer端的证书,有效期为一年
    22.       "peer": {
    23.         "expiry": "8760h",
    24.         "usages": ["signing", "key encipherment", "server auth", "client auth"]
    25.       },
    26.       # 定义kubernetes的证书,有效期为一年
    27.       "kubernetes": {
    28.         "expiry": "8760h",
    29.         "usages": ["signing", "key encipherment", "server auth", "client auth"]
    30.       },
    31.       # 定义ca的证书,有效期为五年
    32.       "ca": {
    33.         "expiry": "43800h",
    34.         "usages": ["signing", "key encipherment", "server auth", "client auth"]
    35.       }
    36.     }
    37.   }
    38. }
    复制代码
    配置文件字段说明:
    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 配置文件
    1. # 定义CSR文件,需要将json文件中的注释去掉
    2. [root@master ~/cfssl]# cat ca-csr.json
    3. {
    4.   # 根 CA 的通用名称,对于服务器证书,CN 通常是域名(如www.example.com);
    5.   # 对于 CA 证书,CN 是 CA 的标识名称。
    6.   "CN": "My Root CA",
    7.   "key": {
    8.     # 加密算法
    9.     "algo": "rsa",
    10.     # 密钥长度
    11.     "size": 4096
    12.   },
    13.   "names": [
    14.     {
    15.       # 国家代码,CN代表是中国
    16.       "C": "CN",
    17.       # 省份
    18.       "ST": "Beijing",
    19.       # 城市或地区
    20.       "L": "Beijing",
    21.       # 组织名称(Organization),可以理解成公司名称
    22.       "O": "rootca",
    23.       # 组织单位(Organizational Unit),可以理解成公司部门
    24.       "OU": "ca"
    25.     }
    26.   ],
    27.   # 根 CA 证书的配置,指定有效期为10年
    28.   "ca": {
    29.     "expiry": "87600h"
    30.   }
    31. }
    复制代码
    生成根 CA 证书和私钥
    1. [root@master ~/cfssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca/ca
    2. 2025/05/15 11:23:34 [INFO] generating a new CA key and certificate from CSR
    3. 2025/05/15 11:23:34 [INFO] generate received request
    4. 2025/05/15 11:23:34 [INFO] received CSR
    5. 2025/05/15 11:23:34 [INFO] generating key: rsa-4096
    6. 2025/05/15 11:23:34 [INFO] encoded CSR
    7. 2025/05/15 11:23:34 [INFO] signed certificate with serial number 492661591325776778969123330542788728689689366584
    复制代码
    命令解释:
    1. cfssl gencert:cfssl 工具的子命令,用于生成证书
    2. -initca:指定生成自签名的根 CA 证书
    3. ca-csr.json:证书签名请求(CSR)的配置文件路径,对应上面创建的 ca-csr.json
    4. cfssljson:处理 cfssl 生成的 JSON 输出并转换为文件
    5. -bare ca:指定输出文件名前缀为 ca,会生成以下三个文件:
    6.         ca.pem:根 CA 证书(自签名)
    7.         ca-key.pem:根 CA 的私钥(必须严格保密!)
    8.         ca.csr:证书签名请求(通常自签名 CA 不需要保留此文件)
    复制代码
    查看当前的目录:
    1. [root@master ~/cfssl]# tree
    2. .
    3. ├── ca
    4. │   ├── ca.csr
    5. │   ├── ca-key.pem # 根 CA 私钥(严格保密!)
    6. │   └── ca.pem #根 CA 证书(公钥,需分发给客户端)
    7. ├── ca-config.json
    8. ├── ca-csr.json
    复制代码
    生成中间CA证书和私钥

    中间CA证书文件
    1. [root@master ~/cfssl]# cat intermediate-csr.json
    2. {
    3.   "CN": "My Intermediate CA",
    4.   "key": {
    5.     "algo": "rsa",
    6.     "size": 4096
    7.   },
    8.   "names": [
    9.     {
    10.       "C": "CN",
    11.       "ST": "Beijing",
    12.       "L": "Beijing",
    13.       "O": "baidu",
    14.       "OU": "Intermediate CA"
    15.     }
    16.   ]
    17. }
    复制代码
    生成中间 CA 证书和私钥
    1. [root@master ~/cfssl]# cfssl gencert \
    2.   -ca=ca/ca.pem \
    3.   -ca-key=ca/ca-key.pem \
    4.   -config=ca-config.json \
    5.   -profile=ca \
    6.   intermediate-csr.json | cfssljson -bare intermediate/intermediate
    7. 2025/05/15 11:29:49 [INFO] generate received request
    8. 2025/05/15 11:29:49 [INFO] received CSR
    9. 2025/05/15 11:29:49 [INFO] generating key: rsa-4096
    10. 2025/05/15 11:29:49 [INFO] encoded CSR
    11. 2025/05/15 11:29:49 [INFO] signed certificate with serial number 722124812765078011706922545691404003361157472292
    12. 2025/05/15 11:29:49 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    13. websites. For more information see the Baseline Requirements for the Issuance and Management
    14. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    15. specifically, section 10.2.3 ("Information Requirements").
    复制代码
    查看文件
    1. [root@master ~/cfssl]# tree
    2. .
    3. ├── ca
    4. │   ├── ca.csr
    5. │   ├── ca-key.pem # 根 CA 私钥(严格保密!)
    6. │   └── ca.pem #根 CA 证书(公钥,需分发给客户端)
    7. ├── ca-config.json
    8. ├── ca-csr.json├── intermediate│   ├── intermediate.csr│   ├── intermediate-key.pem # 中间 CA 私钥(需保密)│   └── intermediate.pem #中间 CA 证书└── intermediate-csr.json
    复制代码
    生成服务器证书

    配置服务器证书文件
    1. [root@master ~/cfssl]# cat server-csr.json
    2. {
    3.   "CN": "*.huangsir-devops.cn",
    4.   "key": {
    5.     "algo": "rsa",
    6.     "size": 2048
    7.   },
    8.   "hosts": [
    9.     "*.huangsir-devops.cn",
    10.     "www.huangsir-devops.cn",
    11.     "api.huangsir-devops.cn",
    12.     "localhost",
    13.     "127.0.0.1",
    14.     "10.37.97.56"
    15.   ]
    16. }
    复制代码
    使用中间CA签署服务器证书
    1. [root@master ~/cfssl]# cfssl gencert \
    2.   -ca=intermediate/intermediate.pem \
    3.   -ca-key=intermediate/intermediate-key.pem \
    4.   -config=ca-config.json \
    5.   -profile=server \
    6.   server-csr.json | cfssljson -bare server/server
    7. 2025/05/15 11:37:29 [INFO] generate received request
    8. 2025/05/15 11:37:29 [INFO] received CSR
    9. 2025/05/15 11:37:29 [INFO] generating key: rsa-2048
    10. 2025/05/15 11:37:30 [INFO] encoded CSR
    11. 2025/05/15 11:37:30 [INFO] signed certificate with serial number 666935063085228543415452828659279667302813819643
    复制代码
    查看生成的文件
    1. [root@master ~/cfssl]# tree
    2. .
    3. ├── ca
    4. │   ├── ca.csr
    5. │   ├── ca-key.pem
    6. │   └── ca.pem
    7. ├── ca-config.json
    8. ├── ca-csr.json
    9. ├── intermediate
    10. │   ├── intermediate.csr
    11. │   ├── intermediate-key.pem
    12. │   └── intermediate.pem
    13. ├── intermediate-csr.json
    14. ├── server
    15. │   ├── server.csr
    16. │   ├── server-key.pem #服务端私钥
    17. │   └── server.pem #服务端公钥
    18. └── server-csr.json
    复制代码
    nginx测试配置
    1. [root@master /data/nginx]# cat /etc/nginx/conf.d/test1.conf
    2. server{
    3.   listen 443 ssl;
    4.   server_name www.huangsir-devops.cn;
    5.   # 配置公钥证书
    6.   ssl_certificate /etc/ssl/server/server.pem;
    7.   # 配置私钥证书
    8.   ssl_certificate_key /etc/ssl/server/server-key.pem;
    9.   # 推荐的 SSL 协议和加密算法(安全配置)
    10.   ssl_protocols TLSv1.2 TLSv1.3;
    11.   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;
    12.   ssl_prefer_server_ciphers off;
    13.   root /data/nginx/;
    14.   location / {
    15.     index index.html;
    16.   }
    17. }
    18. # http跳转到https
    19. server {
    20. listen 80;
    21. server_name www.huangsir-devops.cn;
    22. return 301 https://www.huangsir-devops.cn$request_uri;
    23. }
    复制代码
    生成客户端证书

    配置客户端证书文件
    1. [root@master ~/cfssl]# cat client-csr.json
    2. {
    3.   "CN": "client",
    4.   "key": {
    5.     "algo": "rsa",
    6.     "size": 2048
    7.   }
    8. }
    复制代码
    使用中间CA签署客户端证书
    1. [root@master ~/cfssl]# cfssl gencert \
    2.   -ca=intermediate/intermediate.pem \
    3.   -ca-key=intermediate/intermediate-key.pem \
    4.   -config=ca-config.json \
    5.   -profile=client \
    6.   client-csr.json | cfssljson -bare client/client
    7. # 查看证书
    8. [root@master ~/cfssl]# tree
    9. .
    10. ├── ca
    11. │   ├── ca-key.pem
    12. │   ├── ca.csr
    13. │   └── ca.pem
    14. ├── ca-config.json
    15. ├── ca-csr.json
    16. ├── client
    17. │   ├── client-key.pem # 公钥
    18. │   ├── client.csr
    19. │   └── client.pem # 私钥证书
    20. ├── client-csr.json
    21. ├── intermediate
    22. │   ├── intermediate-key.pem
    23. │   ├── intermediate.csr
    24. │   └── intermediate.pem
    25. ├── intermediate-csr.json
    26. ├── server
    27. │   ├── server-key.pem
    28. │   ├── server.csr
    29. │   └── server.pem
    30. └── server-csr.json
    31. 4 directories, 17 files
    复制代码
    生成K8s证书

    K8s证书有很多类型,
    生成API Server证书

    配置客户端证书文件
    1. [root@master ~/cfssl]# cat k8s-apiserver-csr.json
    2. {
    3.   "CN": "kubernetes-apiserver",
    4.   "key": {
    5.     "algo": "rsa",
    6.     "size": 2048
    7.   },
    8.   "hosts": [
    9.    # Kubernetes服务IP (Service Cluster IP Range)
    10.     "10.0.0.30",
    11.     "10.0.0.31",
    12.     "10.0.0.32"
    13.      # API Server IP
    14.     "192.168.1.10",
    15.     "kubernetes",
    16.     "kubernetes.default",
    17.     "kubernetes.default.svc",
    18.     "kubernetes.default.svc.cluster",
    19.     "kubernetes.default.svc.cluster.local",
    20.     "localhost",
    21.     "127.0.0.1"
    22.   ]
    23. }
    复制代码
    使用中间CA签署客户端证书
    1. [root@master ~/cfssl]# cfssl gencert \
    2.   -ca=intermediate/intermediate.pem \
    3.   -ca-key=intermediate/intermediate-key.pem \
    4.   -config=ca-config.json \
    5.   -profile=kubernetes \
    6.   k8s-apiserver-csr.json | cfssljson -bare api-server/api-server
    复制代码
    持续更新中

    来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册