开源
CFSSL:支持多种证书格式和加密算法
来源:元经纪     阅读:932
网站管理员
发布于 2023-03-08 05:56
查看主页

概述

CFSSL 是 CloudFlare 的 PKI/TLS 工具包。它既是一个命令行工具,也是一个 HTTP API 服务器,用于签署、验证和捆绑 TLS 证书。它需要 Go 1.16+ 才能构建。

请注意,某些 linux 发行版已删除某些算法(特别是基于 RHEL 的发行版),因此官方存储库中的 golang 将无法使用。这些发行版的用户应该 手动安装 go来安装 CFSSL。

CFSSL 包括:

[hidecontent type="logged" desc="隐藏内容:登录后可查看"]

建筑

构建 cfssl 需要 有效的 Go 1.16+ 安装

$ git clone git@github.com:cloudflare/cfssl.git
$ cd cfssl
$ make

生成的二进制文件将位于 bin 文件夹中:

$ tree bin
bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca

0 directories, 8 files

交叉编译

您可以设置GOOSGOARCH环境变量,让 Go 为其他平台进行交叉编译;但是,cfssl 需要 cgo,而 cgo 需要针对目标平台的有效编译器工具链。

安装

安装需要有效的 Go 1.16+ 安装。或者,可以使用预构建的二进制文件

$ go get github.com/cloudflare/cfssl/cmd/cfssl

将下载、构建和安装 CFSSL 工具。

要安装此存储库中的任何其他实用程序(例如cfssljson在本例中):

$ go get github.com/cloudflare/cfssl/cmd/cfssljson

这将下载、构建和安装 CFSSLJSON 工具。

并简单地安装此 repo 中的所有程序:

$ go get github.com/cloudflare/cfssl/cmd/...

如果你在 1.18 以上:

$ go install github.com/cloudflare/cfssl/cmd/...@latest

这将下载、构建和安装所有实用程序(包括cfsslcfssljsonmkbundle)。

使用命令行工具

命令cfssl行工具使用命令来指定它应该执行的操作:

   sign             signs a certificate
   bundle           build a certificate bundle
   genkey           generate a private key and a certificate request
   gencert          generate a private key and a certificate
   serve            start the API server
   version          prints out the current version
   selfsign         generates a self-signed certificate
   print-defaults   print default configurations

用于cfssl [command] -help查找有关命令的更多信息。该version命令不带任何参数。

签约

cfssl sign [-ca cert] [-ca-key key] [-hostname comma,separated,hostnames] csr [subject]

csr是客户端的证书请求。和标志分别-ca-ca-key CA 的证书和私钥。默认情况下,它们是ca.pemca_key.pem。这-hostname是一个逗号分隔的主机名列表,它会覆盖证书 SAN 扩展中的 DNS 名称和 IP 地址。例如,假设 CA 的私钥在 中 /etc/ssl/private/cfssl_key.pem并且 CA 的证书在 中 ,为 cloudflare.com/etc/ssl/certs/cfssl.pem签署证书:cloudflare.pem

cfssl sign -ca     /etc/ssl/certs/cfssl.pem       \
           -ca-key /etc/ssl/private/cfssl_key.pem \
           -hostname cloudflare.com               \
           ./cloudflare.pem

也可以用标志指定 CSR -csr。通过这样做,标志值优先并将覆盖参数。

主题是一个可选文件,其中包含应该用来代替来自 CSR 的信息的主题信息。它应该是一个 JSON 文件,如下所示:

{
    "CN": "example.com",
    "names": [
        {
            "C":  "US",
            "L":  "San Francisco",
            "O":  "Internet Widgets, Inc.",
            "OU": "WWW",
            "ST": "California"
        }
    ]
}

注意从 Go 1.7 开始,自签名证书将不包括 AKI

捆绑

cfssl bundle [-ca-bundle bundle] [-int-bundle bundle] \
             [-metadata metadata_file] [-flavor bundle_flavor] \
             -cert certificate_file [-key key_file]

这些捆绑包用于根证书池和中间证书池。此外,平台元数据通过-metadata. 捆绑文件、元数据文件(和辅助文件)可以在以下位置找到:

    https://github.com/cloudflare/cfssl_trust

-cert通过和 分别指定 PEM 编码的客户端证书和密钥-key。如果指定了密钥,将使用密钥构建并验证捆绑包。否则,将在没有私钥的情况下构建捆绑包。代替文件路径,用于-从标准输入读取证书 PEM。证书文件应包含(部分)证书包也是可以接受的。

通过 指定捆绑风味-flavor。共有三种风格: optimal生成最短链和最高级密码算法的捆绑包,ubiquitous生成跨不同浏览器和操作系统平台最广泛接受的捆绑包,以及 force找到与输入证书文件内容相同的可接受捆绑包.

或者,可以直接从域中提取客户端证书。也可以通过 连接到远程地址-ip

cfssl bundle [-ca-bundle bundle] [-int-bundle bundle] \
             [-metadata metadata_file] [-flavor bundle_flavor] \
             -domain domain_name [-ip ip_address]

捆绑输出形式应遵循以下示例:

{
    "bundle": "CERT_BUNDLE_IN_PEM",
    "crt": "LEAF_CERT_IN_PEM",
    "crl_support": true,
    "expires": "2015-12-31T23:59:59Z",
    "hostnames": ["example.com"],
    "issuer": "ISSUER CERT SUBJECT",
    "key": "KEY_IN_PEM",
    "key_size": 2048,
    "key_type": "2048-bit RSA",
    "ocsp": ["http://ocsp.example-ca.com"],
    "ocsp_support": true,
    "root": "ROOT_CA_CERT_IN_PEM",
    "signature": "SHA1WithRSA",
    "subject": "LEAF CERT SUBJECT",
    "status": {
        "rebundled": false,
        "expiring_SKIs": [],
        "untrusted_root_stores": [],
        "messages": [],
        "code": 0
    }
}

生成证书签名请求和私钥

cfssl genkey csr.json

要生成私钥和相应的证书请求,请将密钥请求指定为 JSON 文件。该文件应遵循以下格式:

{
    "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"
        }
    ]
}

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

cfssl genkey -initca csr.json | cfssljson -bare ca

要生成自签名根 CA 证书,请将密钥请求指定为格式与“genkey”中相同的 JSON 文件。三个 PEM 编码的实体将出现在输出中:私钥、csr 和自签名证书。

生成远程颁发的证书和私钥。

cfssl gencert -remote=remote_server [-hostname=comma,separated,hostnames] csr.json

这会调用genkey但有一个远程 CFSSL 服务器签名并颁发证书。您可以用来-hostname覆盖证书 SAN。

生成本地颁发的证书和私钥。

cfssl gencert -ca cert -ca-key key [-hostname=comma,separated,hostnames] csr.json

这会通过 JSON 请求从本地 CA 生成并颁发证书和私钥。您可以用来-hostname覆盖证书 SAN。

使用新颁发的证书更新 OCSP 响应文件

cfssl ocspsign -ca cert -responder key -responder-key key -cert cert \
 | cfssljson -bare -stdout >> responses

这将为 生成 OCSP 响应cert并将其添加到 responses文件中。然后您可以传递responses给以ocspserve启动 OCSP 服务器。

启动 API 服务器

CFSSL 自带一个基于 HTTP 的 API 服务器;端点记录在doc/api/intro.txt. 服务器使用以下serve 命令启动:

cfssl serve [-address address] [-ca cert] [-ca-bundle bundle] \
            [-ca-key key] [-int-bundle bundle] [-int-dir dir] [-port port] \
            [-metadata file] [-remote remote_host] [-config config] \
            [-responder cert] [-responder-key key] [-db-config db-config]

地址和端口默认为“127.0.0.1:8888”。和参数应该是 PEM 编码的证书和用于-ca签名-ca-key 的私钥;默认情况下,它们是ca.pemca_key.pem。和 应该分别是用于根证书池和中间证书池的证书包-ca-bundle-int-bundle这些分别默认为ca-bundle.crtint-bundle.crt。如果 -remote指定该选项,所有签名操作将被转发到远程 CFSSL。

-int-dir指定中间目录。-metadata是根证书存在的文件。该文件的内容是一个 json 字典 (k,v),因此每个密钥 k 都是根证书的 SHA-1 摘要,而值 v 是密钥存储文件名的列表。-config指定配置文件的路径。-responder和 -responder-key分别是 OCSP 响应者的证书和私钥。

可以使用该选项控制日志记录的数量-loglevel。这是在serve 命令之后:

cfssl serve -loglevel 2

级别是:

  • 0 - 调试
  • 1 - 信息(这是默认级别)
  • 2 - 警告
  • 3 - 错误
  • 4 - 严重

多根树

cfssl程序可以充当在线证书颁发机构,但它只使用一个密钥。如果需要多个签名密钥, multirootca可以使用该程序。它只提供signauthsigninfo端点。该文档包含配置和运行 CA 的说明。

mkbundle 工具

mkbundle用于构建用于验证证书的根和中间包。它可以安装

go get github.com/cloudflare/cfssl/cmd/mkbundle

它获取一组证书,检查 CRL 吊销(计划在下一个版本中支持 OCSP)和过期证书,并将它们捆绑到一个文件中。它采用证书目录和证书文件(可能包含多个证书)。例如,如果目录intermediates包含许多中间证书:

mkbundle -f int-bundle.crt intermediates

将检查这些证书并将有效证书合并到一个 int-bundle.crt文件中。

-f标志指定输出名称;-loglevel指定日志记录的详细程度(使用与上面相同的日志级别),并-nw控制撤销检查工作者的数量。

cfssljson 实用程序

大多数输出cfssl​​都是 JSON 格式。该实用程序可以根据需要将此cfssljson输出拆分为单独的keycertificateCSR和 文件。bundle该工具采用一个标志 ,-f用于指定输入文件,以及一个参数,用于指定所生成文件的基本名称。如果输入文件名是-(这是默认值),cfssljson 从标准输入读取。它通过以下方式将 JSON 文件中的键映射到文件名:

  • 如果指定了 certcertificate , 将生成basename.pem 。
  • 如果指定了 key 或private_key , 将生成basename-key.pem 。
  • 如果指定了csr 或certificate_request , 将生成basename.csr 。
  • 如果 指定了 bundle , 将生成basename-bundle.pem 。
  • 如果指定了 ocspResponse ,将生成basename-response.der 。

您可以将编码-stdout后的内容传递到标准输出,而不是保存到文件中。

静态构建

默认情况下,网络资产是根据它们的相对位置从磁盘访问的。如果您希望分发单个静态链接的cfssl二进制文件,您需要在构建之前嵌入这些资源。这可以通过 go.rice工具来完成。

pushd cli/serve && rice embed-go && popd

然后构建go build将使用嵌入式资源。

[/hidecontent]

 
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 开源
抓难点拓出路,互联数智破解企业数字化转型困局
中国银行成武支行:心系客户,金融服务送上门
平安壹钱包获“年度最具竞争力数字金融机构”奖项
华胜天成2024年大事迹揭晓!
同档位最轻薄小屏旗舰!OPPO新品曝光:厚度不到8mm

首页

分类

定制方案

消息

我的