Kubernetes 证书配置

Kubernetes 证书配置大全


证书是网络通信的安全的要素,是现代网络通信的基本配置。各种远程调用的安全都离不开非对称加密提供的保障。

下载证书工具


cfssl 是 CloudFlare 开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具(cfssl, cfssljson)用于签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。与 OpenSSL 相比,cfssl 使用起来更简单。

Github 地址: https://github.com/cloudflare...
官网地址: https://pkg.cfssl.org/

如果有golang环境,用go安装很简单

$ go get -u github.com/cloudflare/cfssl/cmd/cfssl
$ go get -u github.com/cloudflare/cfssl/cmd/cfssljson

CA 可以用来签发证书。比如用于k8s的用户及组件的认证,CA 需要一个CA证书及私钥,私钥可以用于签发证书。

cfssl来自cloudflare。可以生成CA,签发证书

使用cfssl需要两个文件:

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

ca-config.json    CA的配置文件

cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": ["signing", "key encipherment", "server auth", "client auth"],
        "expiry": "8760h"
      }
    }
  }
}
EOF
  • profiles:是证书的类型,本例中该证书用于签名,且是双向对等证书(server auth, client auth)
  • 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都有的。成员之间共用,供它们彼此之间通信使用

第二个文件是证书的签名请求文件(certificate signing request) ca-csr.json 

cat > ca-csr.json <<EOF
{
  "CN": "Kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "China",
      "O": "Kubernetes",
      "OU": "CA",
      "ST": "Zhejiang"
    }
  ]
}
EOF
#生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。
#请保持ca-key.pem文件的安全。此密钥允许在CA中创建任何类型的证书。*.csr 文件在整个过程中不会使用

CN 是请求用户的用户名  O:是请求用户的组名

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

上述命令会生成一个证书 ca.pem ,一个私钥 ca-key.pem,以及ca.csr (证书签名请求). 

openssl x509 -in ca.pem -text -noout

cfssljson 实用程序


大部分 cfssl 的输出为 JSON 格式。cfssljson 可以将输出拆分出来为独立的key,certificate,CSR 和 bundle文件。该工具需要指定参数,-f 指定输入文件,后接一个参数,指定生成的文件的基本名称。如果输入文件名是 -(默认值),则 cfssljson 从标准输入读取。它以下列方式将 JSON 文件中的键映射到文件名:

  • 如果指定了cert或certificate, 将生成basename.pem。
  • 如果指定了key 或private_key,则将生成basename-key.pem。
  • 如果指定了csr 或certificate_request,则将生成basename.csr。
  • 如果 指定了bundle, 则将生成basename-bundle.pem。
  • 如果指定了ocspResponse, 则将生成basename-response.der。
    您可以传递-stdout输出编码内容到标准输出,而不是保存到文件。

验证证书有效期


cfssl certinfo -cert /etc/kubernetes/ssl/ca.pem |grep not_after
cfssl certinfo -cert  /etc/kubernetes/ssl/admin.pem |grep not_after
cfssl certinfo -cert /etc/kubernetes/ssl/kubernetes.pem |grep not_after
cfssl certinfo -cert /etc/kubernetes/ssl/kube-proxy.pem  |grep not_after

生成新证书


证书分四类

  • ca.pem - 私有CA根证书
  • kubernetes.pem - 与 node 通信的,及APIServer的证书
  • kube-proxy.pem - k8s 与容器通信的
  • admin.pem - kubectl 管理用

生成证书请求


在生成证书过程中需要有四类文件

  • *.csr - 证书请求文件,base64格式,有-----BEGIN CERTIFICATE REQUEST-----标识
  • *csr.json - 证书请求文件,是上面格式的再封装,便于传给cfssl,json格式,大括号开始
  • *-key.pem - 私匙文件,base64格式,有-----BEGIN RSA PRIVATE KEY-----标识
  • *.pem - 证书文件,base64格式,可以用cfssl certinfo -cert 文件名查看有效期,有-----BEGIN CERTIFICATE-----标识

以上四种文件,前两类是中间产物,过后可以不保留,后两个需要配置到系统中 (通常是主从结点的/etc/kubernetes/ssl目录下)。

中间文件和生成的文件最好放在一起

cat > ca-csr.json << 'HERE'
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
HERE

部分字段说明:
“CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

其他几类证书请求类似

用证书请求生成证书


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

配置证书,使其生效


需要把生成的证书复制到全部 master和 node 结点。

scp *.pem yourname@yournode:/etc/kubernetes/ssl/

 在 master 结点上生成~/.kube/config便于kubectl日常交互使用

KUBE_APISERVER="https://192.168.122.100:6443"  #这里换成你的 master 结点 IP
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER}
kubectl config set-credentials admin \
--client-certificate=/etc/kubernetes/ssl/admin.pem \
--embed-certs=true \
--client-key=/etc/kubernetes/ssl/admin-key.pem
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin
kubectl config use-context kubernetes
ls ~/.kube/config

结点间通信用的证书配置

cd /etc/kubernetes
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
--client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap

bootstrap方式给节点颁发证书


在配置好kubelet-bootstrap.kubeconfig后,重启结点,结点会向master申请证书。

master结点上运行

kubectl get certificatesigningrequests

会发现以下类似的输出

NAME                 AGE       REQUESTOR           CONDITION
node-csr-dAxCUJNZ4   22m       kubelet-bootstrap   Pending

通过以下命令,授权颁发给节点证书

kubectl certificate approve node-csr-dAxCUJNZ4

通过后正常后会输出

certificatesigningrequest "node-csr-dAxCUJNZ4" approved
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值