资讯专栏INFORMATION COLUMN

证书签名工具 CFSSL

沈俭 / 3610人阅读

摘要:任何知道私钥的人都可以充当颁发证书。此密钥允许在中创建任何类型的证书。使用认证中心的私钥和证书签名生成机构的证书和私钥。将在任何机器上工作。它将简化证书例程,但会增加安全风险。

资源

https://blog.cloudflare.com/i... 官方博客

特性 概念 安装

下载安装

  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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32806.html

相关文章

  • kubeadm部署k8s1.9高可用集群--2搭建etcd集群

    摘要:搭建集群前言安装的集群,默认是一个单机的容器化的,并且和通信没有经过加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的集群,二进制部署,守护进程,并且需要生成证书。 搭建etcd集群 前言 kubeadm安装的集群,默认etcd是一个单机的容器化的etcd,并且k8s和etcd通信没有经过ssl加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的etcd集群,...

    ZHAO_ 评论0 收藏0
  • kubeadm部署k8s1.9高可用集群--2搭建etcd集群

    摘要:搭建集群前言安装的集群,默认是一个单机的容器化的,并且和通信没有经过加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的集群,二进制部署,守护进程,并且需要生成证书。 搭建etcd集群 前言 kubeadm安装的集群,默认etcd是一个单机的容器化的etcd,并且k8s和etcd通信没有经过ssl加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的etcd集群,...

    scq000 评论0 收藏0
  • k8s 证书配置大全

    摘要:证书配置大全证书是网络通信的安全的要素,是现代网络通信的基本配置。包含一个命令行工具用于签名,验证并且捆绑证书的服务。 Kubernetes 证书配置大全 证书是网络通信的安全的要素,是现代网络通信的基本配置。各种远程调用的安全都离不开非对称加密提供的保障。 下载证书工具 cfssl 是 CloudFlare 开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具(cfssl,...

    lentrue 评论0 收藏0
  • 如何在Tomcat中做TLS客户端认证

    摘要:顺便一提,如果要使用客户端认证就必须使用服务端认证。修改,添加如下可以看到我们开启了客户端认证,也开启了服务端认证。所以如果要正确访问得像下面这样,指定证书,以及客户端自己签发的证书及测试我们现在用来访问看看。 常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度,而不是其他人伪...

    sugarmo 评论0 收藏0

发表评论

0条评论

沈俭

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<