SSL Tool -- CFSSL
[1] 介绍
我们平时在开发K8s组件的时候,很多时候都需要使用到SSL进行安全连接。在集群中一般是采用自签名证书的方式。目前有很多主流的技术可以生成自签名证书,例如Openssl等。当然,你也选择可以通过K8sAPI让K8s签发证书给你。
本文给大家介绍一个SSL工具: cfssl
CFSSL是一个开源的 PKI(Public Key Infrastructure)/TLS(Transport Layer Security)工具包,由 CloudFlare 公司开发和维护。它提供了一套功能强大的工具,用于创建、管理和操作证书、密钥和其他与 PKI 和 TLS 相关的安全元素。
CFSSL 的主要特点包括:
CFSSL 是一个功能强大的 PKI/TLS 工具包,提供了一系列工具和功能,用于生成、管理和操作证书和密钥。它简化了 PKI 和 TLS 的复杂性,使证书的创建和管理过程更加灵活、自动化和可扩展。
[2] 安装
可以通过curl和go两种安装方式。我更推荐使用go安装
curl安装
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 -o cfssl
chmod +x cfssl
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 -o cfssljson
chmod +x cfssljson
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 -o cfssl-certinfo
chmod +x cfssl-certinfo
go安装
# go version 1.18+
$ go install github.com/cloudflare/cfssl/cmd/...@latest
[3] CFSSL使用
我们首先来看看cfssl cli有哪些参数选项:
$ cfssl -h
Usage:
Available commands:
bundle #生成证书包
version #cfssl版本
gencert #生成key和cert
selfsign #生成自签密钥和证书
info #获取签名者信息
print-defaults #打印 csr和config的JSON模板
sign # 为客户端证书进行签名
......
Top-level flags:
以上仅列举部分常用选项
[4] 案例
我们通过一个案列来熟悉一下cfssl的基本用法。
需求如下: 在dev环境中,小明编写了一个Webhook,需要部署到集群中。由于K8s配置Webhook需要提供自签的CABundle。此时小明将通过cfssl生成证书。
1. 生成CA证书
首先我们需要声明一个ca-csr.json
证书请求文件
# 使用cfssl生成csr文件模板
$ cfssl print-defaults csr > ca-csr.json
# 修改对应的数据
$ vim ca-csr.json
{
# Common Name
"CN": "Kubernetes",
# Hosts (支持泛域名)
"hosts": [
"kubernetes",
"kubernetes.default.svc.cluster.local"
],
# 可以指定对应的加密算法
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"ST": "GD",
"L": "FoShan"
}
]
}
然后通过cfssl生成ca证书和私钥。cfssljson是将管道符前面生成的JSON数据生成为文件。感兴趣的小伙伴可以试一下不加cfssljson。将会得到一串JSON数据。
# initca 指明此csr是用来初始化CA的
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
此时CA文件就生成好了,我们可以看一下目录
$ tree ./
./
|-- ca.csr # csr文件
|-- ca-csr.json
|-- ca-key.pem # 私钥
`-- ca.pem # 证书
2. 使用CA签名证书
我们在第一节生成了CA证书,其实用CA进行自签套路也是一样的。
首先还是声明csr文件
# 修改对应的信息
$ cfssl print-defaults csr > webhook-csr.json
{
"CN": "Webhook",
# 填写serviceDNS
"hosts": [
"webhook-svc.default",
"webhook-svc.default.svc.cluster.local"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"ST": "GD",
"L": "FoShan"
}
]
}
此时我们还需要生成一个CA Config文件。用于CA签名时候使用
$ cfssl print-defaults config > ca-config.json
{
"signing": {
"default": {
"expiry": "168h"
},
# profile里面定义不同的配置
# 例如 kubernetes就是一个配置项
# 我们在CA签名证书时候 可以根据profile的配置 选择不同的配置
"profiles": {
"kubernetes": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
# server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证
# client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
"server auth"
]
},
}
}
}
接下来我们就可以使用CA以及CA Config开始进行签名了
$ cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
webhook-csr.json | cfssljson -bare webhook
-profile参数 填写的就是config中profile声明的key配置,可以在config中声明不同的配置,只要在生成的时候通过profile指定key即可
这时我们看一下生成的文件
$ tree ./
|-- ca-config.json # CA配置
|-- ca.csr # CA的CSR文件
|-- ca-csr.json
|-- ca-key.pem #CA私钥
|-- ca.pem # CA证书
|-- webhook.csr # 证书签名请求
|-- webhook-csr.json
|-- webhook-key.pem # 私钥
`-- webhook.pem #公钥
最后,在webhook中将该公钥私钥配置好,然后将CA.pem给K8s配置,即可以完成我们这个案例。
[5]小结
本文我们学习了一下 cfssl的基本使用,如何生成CA,并且进行签名。其实cfssl还有许多功能值得我们去尝试。类似在CICD中持续集成,证书管理等。在K8s的TLS管理中,也有对cfssl的最佳实践。
下一篇文章我将带大家从0开始搭建一个K8sWebhook。