cfssl简单使用

1、安装

方式1:直接下载

详见:手动生成证书 | Kubernetes

bash 复制代码
# 1、下载cfssl、cfssljson、cfssl-certinfo
# cfssl:用于签发证书
# cfssljson:将cfssl签发生成的证书(json格式)变成文件承载式文件
# cfssl-certinfo:验证查看证书信息
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo

# 2、给cfssl、cfssljson、cfssl-certinfo添加可执行权限
chmod +x /usr/local/bin/cfssl*

方式2:源码编译

详见:https://github.com/cloudflare/cfssl

安装go:

bash 复制代码
# 1、下载页面:https://go.dev/dl/
 
# 2、下载go
wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
 
# 3、解压
tar -xf go1.21.6.linux-amd64.tar.gz
 
# 4、移动go到/usr/local/go
mv go /usr/local/go
 
# 5、添加到环境变量
vi /root/.bash_profile 
 
# 6、/root/.bash_profile文件内容:
# 内容开始----------------------------------------------
# .bash_profile
 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi
 
# User specific environment and startup programs
# 【此处添加go相关信息,并追加到PATH环境变量中】
GO_PATH=/usr/local/go/bin
 
PATH=$PATH:$HOME/bin:$GO_PATH
 
export PATH
# 内容结束----------------------------------------------
 
# 7、使环境变量生效
source /root/.bash_profile
 
# 8、在任意目录执行
go version

安装cfssl:

bash 复制代码
# 1、下载页面:https://github.com/cloudflare/cfssl/releases

# 2、下载cfssl
wget https://github.com/cloudflare/cfssl/archive/refs/tags/v1.6.4.tar.gz -O cfssl-1.6.4.tar.gz

# 3、解压
tar -xf cfssl-1.6.4.tar.gz

# 4、进入目录
cd cfssl-1.6.4

# 5、编译
make

# 6、查看编译后的可执行文件
ls bin

# 7、可将bin目录下的文件移动到/usr/local/bin
# 移动部分可执行文件
mv cfssl /usr/local/bin/cfssl
mv cfssl-certinfo /usr/local/bin/cfssl-certinfo
mv cfssljson /usr/local/bin/cfssljson

2、使用

https://github.com/cloudflare/cfssl/tree/master

查看某个命令使用:cfssl command -help,其中command为某个命令名称

bash 复制代码
# cfssl命令,cfssl 或者 cfssl -help 或者 cfssl -h 或者 cfssl [command] -h
cfssl


No command is given.
Usage:
Available commands:
	ocspdump
	revoke          吊销证书
	info            获取签名者信息
	serve           启动HTTP API服务器
	genkey          生成私钥和证书请求
	ocspserve
	scan
	selfsign        生成自签证书
	bundle          生成证书bundle
	certinfo        查看证书信息
	ocsprefresh
	ocspsign
	print-defaults  打印默认配置
	sign            签名证书
	version         查看版本
	gencert         生成私钥和证书
	gencrl          生成新的证书吊销列表
Top-level flags:
  -allow_verification_with_non_compliant_keys
    	Allow a SignatureVerifier to use keys which are technically non-compliant with RFC6962.
  -loglevel int
    	Log level (0 = DEBUG, 5 = FATAL) (default 1)

2.1、print-defaults

2.1.1、查看config配置

bash 复制代码
# 查看config默认配置
cfssl print-defaults config


# 默认配置数据
{
    "signing": {
        "default": {
            "expiry": "168h"
        },
        "profiles": {
            "www": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            }
        }
    }
}
  • expiry:8760h,表示8760h/24=365天有效期
  • profiles:指定证书使用场景,后续签名生成证书及其私钥时需要指定该场景(profile)名称
  • signing:表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE
  • server auth:表示 client 可以用该该证书对 server 提供的证书进行验证
  • client auth:表示 server 可以用该该证书对 client 提供的证书进行验证

2.1.2、查看csr配置

bash 复制代码
# 查看csr默认配置
cfssl print-defaults csr


# csr默认数据
{
    "CN": "example.net",
    "hosts": [
        "example.net",
        "www.example.net"
    ],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "US",
            "L": "CA",
            "ST": "San Francisco"
        }
    ]
}

CN字段说明:

  • CN:Common Name,所有csr文件都必须有字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名。

hosts字段说明:

  • hosts:网络请求url中的合法主机名或域名集合。

注意:

  1. 超过该集合范围的任何请求都不会被支持认证通过。

  2. CA根证书及其私钥创建过程不需要甚至该字段。其它服务证书创建必须有该字段。

  3. hosts设置技巧:一般都把"127.0.0.1"包含进去;推荐使用域名或vip(vip即虚拟ip),尽量不要用ip地址,否则后期遇到某个服务所在机器宕机要重新更换某1台或多台机器时会面临证书认证不通过的毁灭性尴尬情况,导致扩容失败,集群服务面临毁灭性灾难。这里强烈推荐用域名或vip地址,另外,如果有条件,配置之处建议多预留1-3个host地址,防止后期扩容困难

key字段说明:

  • key:key字段是必须有的字段,其内容一般也比较固定就是:{"algo":"rsa","size":2048},表示使用的加密算法rsa,密文长度2048。:

names字段说明:

  • C:(Country)所在国家简称,只能是国家字母缩写,如中国:CN
  • L:(Locality) 所在地区/城市简称,如Beijing/San Francisco
  • ST:(State/Provice)所在州/省份简称,如Beijing/California
  • O:(Organization Name) 单位名称,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称
  • OU:(other)显示其他内容,常见的内容值有"System"、"Website"等

2.2、genkey

bash 复制代码
# genkey命令
cfssl genkey -h


# genkey命令说明
	cfssl genkey -- generate a new key and CSR

Usage of genkey:
        cfssl genkey CSRJSON

Arguments:
        CSRJSON:    JSON file containing the request, use '-' for reading JSON from stdin

Flags:
  -initca=false: initialise new CA
  -config="": path to configuration file

csr.json文件:

bash 复制代码
{
    "CN": "test",
    "hosts": [
        "example.com",
        "www.example.com",
        "https://www.example.com",
        "jdoe@example.com",
        "127.0.0.1"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C":  "US",
            "L":  "San Francisco",
            "O":  "Internet Widgets, Inc.",
            "OU": "WWW",
            "ST": "California"
        }
    ]
}

2.2.1、生成证书签名请求和私钥

bash 复制代码
# 生成证书签名请求和私钥
cfssl genkey csr.json

# 显示结果{"csr":"证书签名请求","key":"私钥"}
{"csr":"-----BEGIN CERTIFICATE REQUEST-----\nMIIDKDCCAhACAQAweDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEx\nFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdl\ndHMsIEluYy4xDDAKBgNVBAsTA1dXVzENMAsGA1UEAxMEdGVzdDCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBALiGBaS3cwbvPiCMn7E4Gtv8RcwhNssoZG64\nF9sK0Zdg4nlBz6/MJg23cRAPPgxUfFXd/Ad1S3K1xiOOW/Ron7pY4MIAfBXDv4NZ\n2w+Vz4tAGVIW32178dkRzFh9DcYSK0bTkJoHqxJ0uPr5cUcB8EmDkqoi2k4pp6lL\nfNaHP/CMz/fcYUuFEhKGrwQjVUpudcFSGbEYExw9omjLTXPcv5ETCM+99ykq4M/g\nfrE8c1AOO9E7faOJ6DUzCoG1COL92wuQa8U4gqfQL944VodoW62nQLo0ldHbCerW\n1AuX2Jx/hRtproPo+MHOn71eiKm/uqZNHyzXJuW6/GX/tQvkjN8CAwEAAaBrMGkG\nCSqGSIb3DQEJDjFcMFowWAYDVR0RBFEwT4ILZXhhbXBsZS5jb22CD3d3dy5leGFt\ncGxlLmNvbYIXaHR0cHM6Ly93d3cuZXhhbXBsZS5jb22BEGpkb2VAZXhhbXBsZS5j\nb22HBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAEW4O5auXbUPhjPiknlydWMINGJ3\nk6+/zq/9J7gBaTrRH/wSeXJrbekrww/1tkRCUFLCQgczWgcaKO34j0nWIsUOSIdl\nytpzVheiB3+WIot62N6rBOpiCSRXOs9KWA1cK7lz8UcBi1GdgeEekXZSd3LJswO6\nLCTwM1dJUxzNDBHrS/UwGINBteLnqIK4O9pJHG564u1ArMncErs0tSCH7zOPcQWp\n1zbw2rL1LMo/ej8SNyr5LdlZJ9fqI6DQi0etUYUVmt/ErM86/SpIlPTL2a6I6fFb\nJ/L3K0oCEL9LC/CNMB8ZxTLjoqSgoCwlr4V54amiel31ewly2rbNCqRItgc=\n-----END CERTIFICATE REQUEST-----\n","key":"-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAuIYFpLdzBu8+IIyfsTga2/xFzCE2yyhkbrgX2wrRl2DieUHP\nr8wmDbdxEA8+DFR8Vd38B3VLcrXGI45b9GifuljgwgB8FcO/g1nbD5XPi0AZUhbf\nbXvx2RHMWH0NxhIrRtOQmgerEnS4+vlxRwHwSYOSqiLaTimnqUt81oc/8IzP99xh\nS4USEoavBCNVSm51wVIZsRgTHD2iaMtNc9y/kRMIz733KSrgz+B+sTxzUA470Tt9\no4noNTMKgbUI4v3bC5BrxTiCp9Av3jhWh2hbradAujSV0dsJ6tbUC5fYnH+FG2mu\ng+j4wc6fvV6Iqb+6pk0fLNcm5br8Zf+1C+SM3wIDAQABAoIBAHG03Mto5HAUg2NJ\nZKqvWRXQei5VFU/Rnzn/JWwsWYWABW8VV+cL1TNEpF5yFhlBArFjLohmBk00qFmG\nwzF0O2F4nV/PLqe2zVAi0fPjrFYx9Kh6QcpUw26xIgwxW4h/770gaA4SxZ+E3+yA\nRAausiSK+JjxCzd5QcD4LICCLauL/kFgIjNajTjGfjVmsDJDUF9Q5kUbcfnEj0+d\nTIG9k6XzkAgboS7o6dBK0BXDrWr2Btnzmbf0eJUXFVZkpYaHcwgqo988e8ubsoBb\niq33BDyH5+VGc/Vr5BwRoAxQOdx0JgISKMv09l0fD/DvIHivymIw5BYgn8c2/bOL\nLCDPn6kCgYEA1dp9cbXvMsG+2gEOwnTeQlrY7P3Wa5FcGtF3n6Z4ZF2D+SdwcdgO\nKPepwHe9yMYDnfQkj8eoAd6evgnAXyCqXCrFD9V83S3qj8Pdo8mw2hTcxfx6kYNX\ny5zpdgnEH6tYXr0qaGZs5WUv+q372lG8OfGfMGRrLpJVG3rTd/beDKMCgYEA3OPA\n2b5Qo/5Ejt8u7wJ/Q+wKWKx5vcWgl7KHqgfGB/+0X19OIKGcQQTa+J2dQCkfM1ZL\nYuegmtMavvQ5rrpNGJT7bwr+pjedB9cSbvr9zEkgw1cj/ZNSxak6tV130ZVr3864\nADBm2CYWyyUO26fz9yf9fdqNl7U8QEDta9uNJpUCgYB7nn19SeonsQ+d/ZaGmgAQ\n42saM/HK5JAVgJhh1V0qx1QOptm9NWOaEvAxrgYrFSvqFsM7yfI4gnPI7uIhG0Tf\nWmnnqUUwpeY9jL+GeoSczAqC+Fvx2bbaoK3j6elRVT8UJM1q5Cp2wHNnuUMpBK6F\n4EJhOusqVLSV2f58Dlx1eQKBgCC/UzP01xe49okH5XlhsWRsdgw3ZcUQq4JR4XL/\nvAgrjJ4nDvofe37YLW52T33XmtyNipebJ2BMs8Zjhrm0vQFL9Qq9YotZ61niNMVn\nSIEkxkqvfJJ3aOoM8Ls6pCzaLif8CaNdiaG5498yG0XNXInjz9z8rck0AT61YX2A\nCykRAoGAPbr3tp/XbRWDUvZNrK+lAhUEFjuFU9pBQFqBPTlFS45OrotE806QVrYi\n4vcYqvHbSypSecI10DEE7RbxIYaCr9pMqdPvlUkopp1mw5hmZprn5lE2Gz0Y/dv0\n+Aso0bCLAT7H7hx9/58h9y4IBbFOVop7g0wnZS/t18NqgO+PHE8=\n-----END RSA PRIVATE KEY-----\n"}

2.2.2、生成自签名根 CA 证书和私钥

bash 复制代码
# 生成自签名根 CA 证书和私钥
cfssl genkey -initca csr.json | cfssljson -bare ca

# 查看文件列表
ls

# 显示内容,输出中将出现三个 PEM 编码的实体:私钥、csr 和自签名证书
ca.csr  ca-key.pem  ca.pem  csr.json

2.3、gencert

bash 复制代码
# 查看gencert命令
cfssl gencert -h

# gencert命令说明
	cfssl gencert -- generate a new key and signed certificate

Usage of gencert:
    Generate a new key and cert from CSR:
        cfssl gencert -initca CSRJSON
        cfssl gencert -ca cert -ca-key key [-config config] [-profile profile] [-hostname hostname] CSRJSON
        cfssl gencert -remote remote_host [-config config] [-profile profile] [-label label] [-hostname hostname] CSRJSON

    Re-generate a CA cert with the CA key and CSR:
        cfssl gencert -initca -ca-key key CSRJSON

    Re-generate a CA cert with the CA key and certificate:
        cfssl gencert -renewca -ca cert -ca-key key

Arguments:
        CSRJSON:    JSON file containing the request, use '-' for reading JSON from stdin

Flags:
  -initca=false: initialise new CA
  -remote="": remote CFSSL server
  -ca="": CA used to sign the new certificate
  -ca-key="": CA private key
  -config="": path to configuration file
  -hostname="": Hostname for the cert, could be a comma-separated hostname list
  -profile="": signing profile to use
  -label="": key label to use in remote CFSSL server

利用CA根证书及其私钥文件签发生成其它证书及其私钥

步骤如下:

  1. 创建CA根证书配置文件(ca-config.json、ca-csr.json)、目标证书签名请求文件(server-csr.json)
  2. 生成CA根证书及其私钥
  3. 生成目标证书和私钥
  4. 校验证书

详见:手动生成证书 | Kubernetes

2.3.1、创建文件

ca-config.json文件(用来生成 CA 文件):

CA根证书配置文件,一般命名为ca-config.json,它用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景 (profile)。

bash 复制代码
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}

ca-csr.json文件(用于 CA 证书签名请求):

bash 复制代码
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names":[{
    "C": "<country>",
    "ST": "<state>",
    "L": "<city>",
    "O": "<organization>",
    "OU": "<organization unit>"
  }]
}

server-csr.json文件(用来为 API 服务器生成秘钥和证书):

bash 复制代码
{
  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    "<MASTER_IP>",
    "<MASTER_CLUSTER_IP>",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [{
    "C": "<country>",
    "ST": "<state>",
    "L": "<city>",
    "O": "<organization>",
    "OU": "<organization unit>"
  }]
}

2.3.2、生成CA根证书及其私钥

生成 CA 秘钥文件(ca-key.pem)和证书文件(ca.pem

bash 复制代码
# 生成CA根证书及其私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca


# 使用命令ls查看文件列表
ca.csr  ca-csr.json  ca-key.pem  ca.pem

# 注意:cfssljson -bare + 命名文件名,
# 如本例中的ca,表示生成ca.pem和ca-key.pem,分别为证书和私钥文件。
# 生成的ca.pem是CA根证书文件,ca-key.pem是其私钥文件。
# 至此,CA根证书及其私钥文件已经生成,便可以用它们来签发其他认证文件了。

2.3.3、根据CA根证书及其私钥签名生成目标证书和私钥

生成秘钥和证书,默认会分别存储为server-key.pemserver.pem 两个文件。

bash 复制代码
# 生成目标证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
     --config=ca-config.json -profile=kubernetes \
     server-csr.json | cfssljson -bare server


# 参数说明;
# -ca: 根证书
# -ca-key: 根秘钥
# -config: 根证书的配置文件(里面定义了很多场景)
# -profile: 选择根证书配置文件里的一个场景
# server-csr.json : 申请证书的对象的相关信息配置文件
# -bare:制造的证书文件的文件名称(或前缀)

# 使用ls命令查看文件列表
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  server.csr  server-csr.json  server-key.pem  server.pem

2.3.4、校验证书

bash 复制代码
# 方式1:使用openssl命令校验证书
openssl x509  -noout -text -in  etcd.pem

# 说明:
# 确认 Issuer 字段的内容和 ca-csr.json 一致;
# 确认 Subject 字段的内容和 etcd-csr.json 一致;
# 确认 X509v3 Subject Alternative Name 字段的内容和 etcd-csr.json 一致;
# 确认 X509v3 Key Usage、Extended Key Usage 字段的内容和 ca-config.json 中 etcd-opprofile 一致;


# 方式2:使用cfssl-certinfo命令校验证书
cfssl-certinfo -cert ca.pem

详见:

https://github.com/cloudflare/cfssl

Introducing CFSSL - CloudFlare's PKI toolkit

手动生成证书 | Kubernetes

CloudFlare 开源证书管理工具 cfssl 详细使用教程 - 知乎

cfssl自签CA证书用于TLS/SSL认证技术指南

cfssl使用方法重新整理说明-CSDN博客

我在B站学运维之SSL与TLS协议原理与证书签名多种生成方式实践指南 - 哔哩哔哩

cfssl证书工具_Star-Seven的技术博客_51CTO博客

相关推荐
MyFreeIT12 小时前
Let‘s Encrypt SSL 製作免費證書
网络协议·https·ssl
00后程序员张14 小时前
Android证书绑定抓包失败?Android SSL Pinning绕过实战指南
android·网络协议·计算机网络·网络安全·adb·https·ssl
武帝为此17 小时前
【TLS SSL 介绍】
网络·网络协议·ssl
吠品4 天前
SQL Server 版本查询的几种实用方法
数据库·网络协议·ssl
瓦格哈儿5 天前
内网环境也需要证书?聊聊内网 IP 证书的适用边界
网络协议·ssl
CZIDC6 天前
华为服务器TS200-2280 V2 iBMC导入SSL证书后问题案例分析
服务器·https·ssl
m0_617493947 天前
SSLError [ASN1: NOT_ENOUGH_DATA] 问题排查与解决指南
python·ssl
左钦杨9 天前
如何剩下一笔SSL(https)证书的钱?
网络协议·https·ssl
就叫飞六吧11 天前
Cloudflare 免费 SSL 证书与兼容端口列表科普
网络协议·iphone·ssl
2601_9670195112 天前
关于SSL和TLS的常见问题解答
ssl