证书签名工具 CFSSL

递归棱镜
• 阅读 8521

资源

特性

概念

安装

  • 下载安装

      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
      
      sudo cp cfssl_linux-amd64 /usr/local/bin/cfssl 
      sudo cp cfssljson_linux-amd64 /usr/local/bin/cfssljson
      sudo cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
      
      cd /usr/local/bin/ 
      
      chmod +x cfssl
      chmod +x cfssljson
      chmod +x cfssl-certinfo
  • 初始化

    mkdir ~/cfssl
    cd ~/cfssl
    cfssl print-defaults config > ca-config.json
    cfssl print-defaults csr > ca-csr.json
  • 创建自己的内部服务使用的CA认证中心
  • 运行认证中心需要一个CA证书和相应的私钥。后者是极其敏感的数据。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要

    #配置CA的证书生成策略
    cat << EOF > ca-config.json
    {
      "signing": {
          "default": {
              "expiry": "87600h"
          },
          "profiles": {
              "server": {
                  "expiry": "87600h",
                  "usages": [
                      "signing",
                      "key encipherment",
                      "server auth"
                  ]
              },
              "client": {
                  "expiry": "87600h",
                  "usages": [
                      "signing",
                      "key encipherment",
                      "client auth"
                  ]
              },
              "peer": {
                  "expiry": "87600h",
                  "usages": [
                      "signing",
                      "key encipherment",
                      "server auth",
                      "client auth"
                  ]
              }
          }
      }
    }
    EOF
    ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
    signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
    server auth:服务端证书;表示client可以用该 CA 对server提供的证书进行验证;server 由服务器使用,并由客户端验证服务器身份
    client auth:客户端证书;表示server可以用该CA对client提供的证书进行验证;client用于通过服务器验证客户端。
    peer 对等证书;就是server auth、client auth都有的。成员之间共用,供它们彼此之间通信使用
    
    #生成CA的证书和私钥
    cat << EOF > ca-csr.json
    {
      "CN": "dudu_ca",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "dudu_ca",
          "OU": "dudu_ca"
        }
      ]
    }
    EOF
    #生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。
    #请保持ca-key.pem文件的安全。此密钥允许在CA中创建任何类型的证书。*.csr 文件在整个过程中不会使用
    
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    
    #生成如下文件
    ca.csr  ca-key.pem  ca.pem
  • 生成kubernetes的证书。
  • 证书最重要的价值是通用名称(CN)和主机(hosts)
  • 最重要的部分是CN ,这应该是您的主机名和hosts阵列,它必须包含所有的:您的本地主机名、127.0.0.1、服务器的私有IP地址(不是其面向公众的IP)

    #kubernetes服务的生成策略
    cat << EOF > kubernetes-csr.json
    {
      "CN": "kubernetes",
      "hosts": [
        "127.0.0.1",
        "10.29.167.233",
        "169.169.0.1",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
      ],
      "key": {
          "algo": "rsa",
          "size": 2048
      },
      "names": [
          {
              "C": "CN",
              "ST": "BeiJing",
              "L": "BeiJing",
              "O": "k8s",
              "OU": "System"
          }
      ]
    }
    EOF
    #“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
    #"CN": 字段 kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法
    #如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被 etcd 集群和 kubernetes master 集群使用,所以上面分别指定了 etcd 集群、kubernetes master 集群的主机 IP 和 kubernetes 服务的服务 IP(一般是 kue-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1。
    
    #对等证书   生成kubernetes的证书和私钥。使用CA认证中心的私钥和证书签名生成机构的证书和私钥。
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes
    
     #  子节点客户端证书
      cat << EOF > kubernetes-proxy-csr.json
      {
        "CN": "kube-proxy",
        "hosts": [],
        "key": {
          "algo": "rsa",
          "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
          }
        ]
      }
      EOF
     cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-proxy-csr.json | cfssljson -bare proxy
     
     # master 主节点api服务管理客户端证书
     cat << EOF > kubernetes-apiserver-client-csr.json
      {
        "CN": "controllermanager",
        "hosts": [],
        "key": {
          "algo": "rsa",
          "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
          }
        ]
      }
      EOF
     cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-apiserver-client-csr.json | cfssljson -bare apiserver
    
    #生成如下文件
    kubernetes.csr  kubernetes-key.pem  kubernetes.pem
    
    #服务端证书 -profile=server 
    cfssl print-defaults csr > server-csr.json
      "CN": "coreos1",
      "hosts": [
          "192.168.122.68",
          "ext.example.com",
          "coreos1.local",
          "coreos1"
      ],
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
    
    #客户端证书 -profile=client 客户端证书可以忽略hosts,只设定CN通用名
    cfssl print-defaults csr > client-csr.json
      修改
      "CN": "client",
      "hosts": [""],
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client
  • 验证证书

    openssl x509 -in ca.pem -text -noout
    openssl x509 -in server.pem -text -noout
    openssl x509 -in client.pem -text -noout
    
    cfssl-certinfo -cert kubernetes.pem
  • 导入证书到系统,更新系统证书库

    update-ca-trust check   #检查是否启用
    update-ca-trust enable  #启用系统共享CA存储
    cp foo.crt /etc/pki/ca-trust/source/anchors/  #将证书复制到此目录  具有高优先级,不会被覆盖
    update-ca-trust extract   #最后提取更新
    
    cat foo.crt > /etc/pki/tls/certs/ca-bundle.crt   #老版本的处理方式
  • 注意事项
  • 设置所有私钥文件权限 chmod 600 *-key.pem
  • 不要把你的ca-key.pem放入容器的Linux配置,建议将其存放在安全的地方。该密钥允许生成尽可能多的证书
  • 使用通配符*地址生成的密钥和证书。将在任何机器上工作。它将简化证书例程,但会增加安全风险。

常用操作命令

配置

功能

功能1

功能2

调试

优化

常见问题

实际应用

  cat << EOF > kubernetes-csr.json
    {
      "CN": "kubernetes",
      "hosts": [
        "127.0.0.1",
        "10.29.167.233",
        "169.169.0.1",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
      ],
      "key": {
          "algo": "rsa",
          "size": 2048
      },
      "names": [
          {
              "C": "CN",
              "ST": "BeiJing",
              "L": "BeiJing",
              "O": "k8s",
              "OU": "System"
          }
      ]
    }
    EOF
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes
    
  cat << EOF > kubernetes-client-csr.json
  {
    "CN": "controllermanager",
    "hosts": [],
    "key": {
      "algo": "rsa",
      "size": 2048
    },
    "names": [
      {
        "C": "CN",
        "ST": "BeiJing",
        "L": "BeiJing",
        "O": "k8s",
        "OU": "System"
      }
    ]
  }
  EOF
  cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-client-csr.json | cfssljson -bare apiserver
  
  cat << EOF > kube-proxy-csr.json
  {
    "CN": "kube-proxy",
    "hosts": [],
    "key": {
      "algo": "rsa",
      "size": 2048
    },
    "names": [
      {
        "C": "CN",
        "ST": "BeiJing",
        "L": "BeiJing",
        "O": "k8s",
        "OU": "System"
      }
    ]
  }
  EOF
  cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json | cfssljson -bare proxy
  
  证书转为浏览器可用的p12证书
  openssl pkcs12 -export -in apiserver.pem  -out apiserver.p12 -inkey apiserver-key.pem
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
3年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Stella981 Stella981
3年前
Kubernetes集群部署之二CA证书制作
创建TLS证书和秘钥kubernetes系统的各组件需要使用TLS证书对通信进行加密,本文档使用CloudFlare的PKI工具集cfssl来生成CertificateAuthority(CA)和其它证书.1\.下载并安装CFSSL:root@k8smaster~cd/usr/local/src
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Stella981 Stella981
3年前
Flink SQL Window源码全解析
!(https://oscimg.oschina.net/oscnet/72793fbade36fc18d649681ebaeee4cdf00.jpg)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MzgwNT
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(