SSL Tool CFSSL

2023年 7月 19日 31.8k 0

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

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论