SSL Tool — CFSSL

SSL Tool — CFSSL

[1] 介绍

我们平时在开发K8s组件的时候,很多时候都需要使用到SSL进行安全连接。在集群中一般是采用自签名证书的方式。目前有很多主流的技术可以生成自签名证书,例如Openssl等。当然,你也选择可以通过K8sAPI让K8s签发证书给你。

本文给大家介绍一个SSL工具: cfssl

CFSSL是一个开源的 PKI(Public Key Infrastructure)/TLS(Transport Layer Security)工具包,由 CloudFlare 公司开发和维护。它提供了一套功能强大的工具,用于创建、管理和操作证书、密钥和其他与 PKI 和 TLS 相关的安全元素。

CFSSL 的主要特点包括:

  1. 证书签发和管理:CFSSL 支持生成自签名证书、颁发证书签名请求(CSR)以及使用自定义的 CA(Certificate Authority)签发证书。它提供了一个灵活的证书配置文件,可以根据需要自定义证书的属性和扩展,如公钥、私钥、有效期、主题和 SAN(Subject Alternative Name)等。
  2. 自动化和集成:CFSSL 可与自动化工具和流程集成,例如配置管理工具、容器编排平台和 CI/CD 管道等。它提供了命令行接口和 API,以便在自动化环境中生成和管理证书。
  3. TLS 证书链的创建和验证:CFSSL 可以创建完整的 TLS 证书链,包括根证书、中间证书和终端证书。它还支持验证证书链的有效性,以确保证书链的正确性和信任。
  4. 证书续订和吊销:CFSSL 提供了证书续订和吊销的功能,使得可以轻松地管理证书的生命周期。它可以根据预定义的策略和时间表自动续订证书,并提供了吊销证书的选项。
  5. 基于 JSON 的配置和配置模板:CFSSL 使用基于 JSON 的配置文件和模板来定义证书和相关的配置。这使得配置的管理和维护更加简单和可扩展。

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。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYUrdqNV' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片