[小记] cfssl安装及使用

10,451 阅读3分钟

1. 简介

  • CFSSL是CloudFlare的PKI / TLS瑞士×××。它既是命令行工具,也是用于签名,验证和捆绑TLS证书的HTTP API服务器.

2. 安装及使用

  1. 下载安装CFSSL(用于签名,验证和捆绑TLS证书的HTTP API工具)(master节点)

    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 
    
    mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo  
    mv cfssl_linux-amd64 /usr/local/bin/cfssl  
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson  
    
    chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssl-certinfo /usr/local/bin/cfssljson
    
  2. 创建CA(Certificate Authority)(master节点)

    mkdir /root/ssl
    cd /root/ssl
    cfssl print-defaults config > config.json # 默认配置模板
    cfssl print-defaults csr > csr.json #默认csr请求模板
    # 根据config.json文件的格式创建如下的ca-config.json文件
    # 过期时间设置成了 87600h
    cat > ca-config.json <<EOF
     {
       "signing": {
         "default": {
           "expiry": "87600h"
         },
         "profiles": {
           "kubernetes": {
             "usages": [
                 "signing",
                 "key encipherment",
                 "server auth",
                 "client auth"
             ],
             "expiry": "87600h"
           }
         }
       }
     }
     EOF     
    

    知识点

    • a-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;此实例只有一个kubernetes模板。
    • signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
    • server auth:表示client可以用该 CA 对server提供的证书进行验证;
    • client auth:表示server可以用该CA对client提供的证书进行验证;
  3. 创建证书请求

    cat > ca-csr.json <<EOF
    {
      "CN": "kubernetes",    
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "GuangDong",
          "L": "ShenZhen",
          "O": "k8s",
          "OU": "System"
        }
      ],
        "ca": {
           "expiry": "87600h"
        }
    }   
    EOF
    

    知识点:

    • "CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name)
    • "O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
  4. 生成CA证书和私,将会生成 ca-key.pem(私钥) ca.pem(公钥)

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

    知识点:

    • cfssljson只是整理json格式,-bare主要的意义在于命名 (个人见解,以便理解,勿喷)
  5. 创建kubernetes证书请求文件

    cat > kubernetes-csr.json <<EOF
    {
     "CN": "kubernetes",
     "hosts": [
       "127.0.0.1",
       "10.192.44.129",
       "10.192.44.128",
       "10.192.44.126",
       "10.192.44.127",
       "10.254.0.1",
       "*.kubernetes.master",
       "localhost",
       "kubernetes",
       "kubernetes.default",
       "kubernetes.default.svc",
       "kubernetes.default.svc.cluster",
       "kubernetes.default.svc.cluster.local"
     ],
     "key": {
         "algo": "rsa",
         "size": 2048
     },
     "names": [
         {
             "C": "CN",
             "ST": "GuangDong",
             "L": "ShenZhen",
             "O": "k8s",
             "OU": "System"
          }
      ]
    }
    EOF
    

    知识点:

    • 这个证书目前专属于 apiserver加了一个 *.kubernetes.master 域名以便内部私有 DNS 解析使用(可删除);至于很多人问过 kubernetes 这几个能不能删掉,答案是不可以的;因为当集群创建好后,default namespace 下会创建一个叫 kubenretes 的 svc,有一些组件会直接连接这个 svc 来跟 api 通讯的,证书如果不包含可能会出现无法连接的情况;其他几个 kubernetes 开头的域名作用相同
    • hosts包含的是授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误。
    • 10.254.0.1是指kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP。
    • hosts配置区域,即一个证书的网站可以是*.youku.com也是可以是*.google.com
  6. kubernetes证书和私钥

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes 
    

    知识点:

    • -config 引用的是模板中的默认配置文件,-profiles是指定特定的使用场景,比如ca-config.json中的kubernetes区域
  7. 创建admin证书

    cat > admin-csr.json <<EOF
    {
    "CN": "admin",
    "hosts": [],
    "key": {
     "algo": "rsa",
     "size": 2048
    },
    "names": [
     {
       "C": "CN",
       "ST": "GuangDong",
       "L": "ShenZhen",
       "O": "system:masters",
       "OU": "System"
     }
    ]
    }
    EOF
    
  8. 生成admin证书和私钥

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
    

    知识点:

    • 这个admin 证书,是将来生成管理员用的kube config 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group