• kubernetes CFSSL工具管理k8s组件证书(摘)


    前言

    在学习k8s的过程中,尤其是二进制搭建k8s集群的过程中,需要产生好多组件证书:

    • apiserver和etcd作为服务端证书,先自签一个CA根证书(相当于自建一个免费的CA机构),再使用这个自签的根证书去签发 apiserver 和 etcd 的https证书。
    • 由于apiserver默认认证方式是开启TLS,所以kubectl、kube-proxy和kubelet都需要客户端证书才能访问apiserver,其中kubectl、kube-proxy需要手动地用CA根证书(签发 apiserver的根证书,不是etcd的)签发,而kubelet使用TLS Bootstaping自动签发证书。
    • 其他自定义的外部用户在访问k8s集群时,同样需要申请客户端证书才能访问apiserver;再根据这个证书创建 kubeconfig 文件方便 kubectl 使用。

    觉得这篇文章概括的很好,正好学习中也是使用CFSSL工具来管理证书,特此转载

    原文链接:公钥基础设施(PKI)/CFSSL证书生成工具的使用

    公钥基础设施(PKI)

    基础概念

    CA(Certification Authority)证书,指的是权威机构给我们颁发的证书。

    密钥就是用来加解密用的文件或者字符串。密钥在非对称加密的领域里,指的是私钥和公钥,他们总是成对出现,其主要作用是加密和解密。常用的加密强度是2048bit。

    RSA即非对称加密算法。非对称加密有两个不一样的密码,一个叫私钥,另一个叫公钥,用其中一个加密的数据只能用另一个密码解开,用自己的都解不了,也就是说用公钥加密的数据只能由私钥解开。

    证书的编码格式

    PEM(Privacy Enhanced Mail),通常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, 和 .key。内容为Base64编码的ASCII码文件,有类似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的头尾标记。服务器认证证书,中级认证证书和私钥都可以储存为PEM格式(认证证书其实就是公钥)。Apache和nginx等类似的服务器使用PEM格式证书。

    DER(Distinguished Encoding Rules),与PEM不同之处在于其使用二进制而不是Base64编码的ASCII。扩展名为.der,但也经常使用.cer用作扩展名,所有类型的认证证书和私钥都可以存储为DER格式。Java使其典型使用平台。

    证书签名请求CSR

    CSR(Certificate Signing Request),它是向CA机构申请数字×××书时使用的请求文件。在生成请求文件前,我们需要准备一对对称密钥。私钥信息自己保存,请求中会附上公钥信息以及国家,城市,域名,Email等信息,CSR中还会附上签名信息。当我们准备好CSR文件后就可以提交给CA机构,等待他们给我们签名,签好名后我们会收到crt文件,即证书。

    注意:CSR并不是证书。而是向权威证书颁发机构获得签名证书的申请。

    把CSR交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成。保留好CSR,当权威证书颁发机构颁发的证书过期的时候,你还可以用同样的CSR来申请新的证书,key保持不变.

    数字签名

    数字签名就是"非对称加密+摘要算法",其目的不是为了加密,而是用来防止他人篡改数据。

    其核心思想是:比如A要给B发送数据,A先用摘要算法得到数据的指纹,然后用A的私钥加密指纹,加密后的指纹就是A的签名,B收到数据和A的签名后,也用同样的摘要算法计算指纹,然后用A公开的公钥解密签名,比较两个指纹,如果相同,说明数据没有被篡改,确实是A发过来的数据。假设C想改A发给B的数据来欺骗B,因为篡改数据后指纹会变,要想跟A的签名里面的指纹一致,就得改签名,但由于没有A的私钥,所以改不了,如果C用自己的私钥生成一个新的签名,B收到数据后用A的公钥根本就解不开。

    常用的摘要算法有MD5、SHA1、SHA256。

    使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。

    数字证书和公钥

    数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机 构的公章)后形成的一个数字文件。实际上,数字证书就是经过CA认证过的公钥,除了公钥,还有其他的信息,比如Email,国家,城市,域名等。

    CFSSL工具

    CFSSL介绍

    项目地址: https://github.com/cloudflare/cfssl

    下载地址: https://pkg.cfssl.org/

    参考链接: https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/

    CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。

    CFSSL包括:

    • 一组用于生成自定义 TLS PKI 的工具

    • cfssl程序,是CFSSL的命令行工具

    • multirootca程序是可以使用多个签名密钥的证书颁发机构服务器

    • mkbundle程序用于构建证书池

    • cfssljson程序,从cfsslmultirootca程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘

    PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:

    • 证书所有组织的信息

    • 公钥

    • 证书颁发组织的信息

    • 证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等

    • 使用证书颁发组织私钥创建的数字签名

    安装cfssl

    cfssl用法参考:https://coreos.com/os/docs/latest/generate-self-signed-certificates.html

    这里我们只用到cfssl工具和cfssljson工具:

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
    mv cfssl_linux-amd64 /usr/local/bin/cfssl
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

    cfssl工具,子命令介绍:

    • bundle: 创建包含客户端证书的证书包

    • genkey: 生成一个key(私钥)和CSR(证书签名请求)

    • scan: 扫描主机问题

    • revoke: 吊销证书

    • certinfo: 输出给定证书的证书信息, 跟cfssl-certinfo 工具作用一样

    • gencrl: 生成新的证书吊销列表

    • selfsign: 生成一个新的自签名密钥和 签名证书

    • print-defaults: 打印默认配置,这个默认配置可以用作模板

        config:生成ca配置模板文件

        csr:生成证书请求模板文件 

    • serve: 启动一个HTTP API服务

    • gencert: 生成新的key(密钥)和签名证书

      • -initca:初始化一个新ca

      • -ca:指明ca的证书

      • -ca-key:指明ca的私钥文件

      • -config:指明请求证书的json文件

      • -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息

    • ocspdump

    • ocspsign

    • info: 获取有关远程签名者的信息

    • sign: 签名一个客户端证书,通过给定的CA和CA密钥,和主机名

    • ocsprefresh

    • ocspserve

    一个栗子

    过程概述:先使用cfssl工具自签发CA根证书,再为k8s组件etcd签发证书。

    1.创建认证中心(CA)

    CFSSL可以创建一个获取和操作证书的内部认证中心。

    运行认证中心需要一个CA证书和相应的CA私钥。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要。

    配置证书生成策略

    配置证书生成策略,让CA软件知道颁发有什么功能的证书。

    #打印config模板文件从而进行修改
    #cfssl print-defaults config > ca-config.json
    
    #对模板进行修改,从而变成适合自己的
    #vim ca-config.json
    {
      "signing": {
        "default": {
          "expiry": "8760h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "8760h"
          }
        }
      }
    }

    这个策略,有一个default默认的配置,和一个profiles,profiles可以设置多个profile,这里的profileetcd

    • default默认策略,指定了证书的默认有效期是一年(8760h)

    • kubernetes:表示该配置(profile)的用途是为kubernetes生成证书及相关的校验工作

      • signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE

      • server auth:表示可以该CA 对 server 提供的证书进行验证

      • client auth:表示可以用该 CA 对 client 提供的证书进行验证

    • expiry:也表示过期时间,如果不写以default中的为准

    cfssl常用命令:

    • cfssl gencert -initca ca-csr.json | cfssljson -bare ca ## 初始化ca

    • cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca ## 使用现有私钥, 重新生成

    • cfssl certinfo -cert ca.pem

    • cfssl certinfo -csr ca.csr

    生成CA证书和私钥(root 证书和私钥)

    创建一个文件ca-csr.json

    #打印csr模板文件从而进行修改
    #cfssl print-defaults csr > ca-csr.json
    
    #vim ca-csr.json
    {
      "CN": "kubernetes",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "ShangHai",
          "L": "ShangHai",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }

    参数介绍:

    • CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法

    • key:生成证书的算法

    • hosts:表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用(本例中没有hosts字段)

    • names:一些其它的属性

      • C: Country, 国家

      • ST: State,州或者是省份

      • L: Locality Name,地区,城市

      • O: Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定)

      • OU: Organization Unit Name,组织单位名称,公司部门

    生成CA证书和CA私钥和CSR(证书签名请求):

    [root@ks-allinone ssl]# cfssl gencert -initca csr.json | cfssljson -bare ca
    2019/08/21 21:10:32 [INFO] generating a new CA key and certificate from CSR
    2019/08/21 21:10:32 [INFO] generate received request
    2019/08/21 21:10:32 [INFO] received CSR
    2019/08/21 21:10:32 [INFO] generating key: ecdsa-256
    2019/08/21 21:10:32 [INFO] encoded CSR
    2019/08/21 21:10:32 [INFO] signed certificate with serial number 672899525398989895780710333033770062104419034384
    [root@ks-allinone ssl]# ll
    total 20
    -rw-r--r--. 1 root root 505 Aug 21 21:10 ca.csr
    -rw-------. 1 root root 227 Aug 21 21:10 ca-key.pem
    -rw-r--r--. 1 root root 745 Aug 21 21:10 ca.pem
    -rw-r--r--. 1 root root 373 Aug 21 14:21 config.json
    -rw-r--r--. 1 root root 287 Aug 21 14:11 csr.json

    该命令会生成3个文件,运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。

    查看cert(证书信息):

    # cfssl certinfo -cert ca.pem

    查看CSR(证书签名请求)信息:

    # cfssl certinfo -csr ca.csr

    2.使用自签 CA 证书签发 Etcd HTTPS 证书

    同样需要先创建一个etcd证书的申请文件:

    cat > server-csr.json<< EOF
    {
      "CN": "etcd",
      "hosts": [
        "172.31.93.210",
        "172.31.93.211"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
        "C": "CN",
        "L": "BeiJing",
        "ST": "BeiJing"
        }
      ]
    }

    签发etcd的证书:

    cfssl gencert 
    -ca=ca.pem 
    -ca-key=ca-key.pem 
    -config=ca-config.json 
    -profile=kubernetes server-csr.json | cfssljson -bare server
    • -ca:指明ca的证书

    • -ca-key:指明ca的私钥文件

    • -config:指明请求证书的json文件,注意不是etcd申请的json文件,而是配置证书生成策略的ca-config.json

    • -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息

    • server-csr.json才是etcd申请的json文件,最后的server将指定生成的证书名
    [root@binary-master etcd]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    2021/03/22 17:50:56 [INFO] generate received request
    2021/03/22 17:50:56 [INFO] received CSR
    2021/03/22 17:50:56 [INFO] generating key: rsa-2048
    2021/03/22 17:50:56 [INFO] encoded CSR
    2021/03/22 17:50:56 [INFO] signed certificate with serial number 487201065380785180427832079165743752767773807902
    2021/03/22 17:50:56 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    websites. For more information see the Baseline Requirements for the Issuance and Management
    of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    specifically, section 10.2.3 ("Information Requirements").
    [root@binary-master etcd]# ls *.pem
    ca-key.pem  ca.pem  server-key.pem  server.pem

    其中server-key.pem和server.pem就是最后需要的etcd证书。

  • 相关阅读:
    字符串转换整数
    list、tuple、dict加*星号
    字符串
    整数反转
    字符串分割函数
    核密度图(直方图的拟合曲线)
    不同缺失值的删除方法
    Z字形变换
    最长回文字串
    寻找两个有序数组的中位数
  • 原文地址:https://www.cnblogs.com/xulan0922/p/14973529.html
Copyright © 2020-2023  润新知