首页 > 解决方案 > Kubernetes 使用哪个证书和密钥来签署 CertificateSigningRequests?

问题描述

我试图自动化为新用户签署 Kubernetes 证书的过程。
官方文档(此处)建议使用 Kubectl。他们特别建议使用以下命令:

kubectl certificate approve csr_name

并通过以下方式获得 base64 编码证书:

kubectl get csr/csr_name -o yaml

看着status.certificate田野。由于我可以访问集群证书(位于 /etc/kubernetes/pki)并且因为我想进一步自动化该过程,所以我想知道 Kubernetes 在签名过程中使用了哪些证书和密钥。我尝试过使用 apiserver、ca 和 kubeadmin(.crt 和 .key)和 openssl,如下所示:

openssl x509 -req my.csr -days 365 -CA /etc/kubernetes/*.crt -CAkey /etc/kubernetes/*.key -CAcreateserial -out my.crt

*.crt上面提到的*.key各种文件在哪里?但结果总是与 kubectl 命令的结果不同。知道我缺少什么吗?

提前致谢!

标签: kubernetescertificatekubectlx509

解决方案


此刻非常部分的答案

1. etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet和kube-proxy的CA

由于我可以访问集群证书(位于 /etc/kubernetes/pki)并且因为我想进一步自动化该过程,所以我想知道 Kubernetes 在签名过程中使用了哪个证书和密钥。

有一个很棒的Kubernetes The Hard Way教程,让您有机会自己检查、测试和尝试如何使用手动创建核心资源的所有证书来手动创建 kubernetes 集群。

配置 CA 并生成 TLS 证书

您将使用 CloudFlare 的 PKI 工具包 cfssl 配置 PKI 基础设施,然后使用它来引导证书颁发机构,并为以下组件生成 TLS 证书:etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet 和kube 代理。

为身份验证生成 Kubernetes 配置文件

您将生成 Kubernetes 配置文件,也称为 kubeconfigs,它使 Kubernetes 客户端能够定位和验证 Kubernetes API 服务器。

2. 新用户创建 你可以使用Kubernetes:我如何访问CA来签署一个新的用户证书?作为参考。复制粘贴历史,以防原始帖子被删除

您可以使用集群中的内置 CA 来创建客户端证书。关于如何使用 CA 的背景信息: https ://kubernetes.io/docs/concepts/cluster-administration/certificates/

假设你有一个 user.json

{
    "CN": "mfrank",
    "key": {
        "algo": "rsa",
        "size": 4096
    },
    "names": [{
        "O": "mfrank",
        "email": "some@email"
    }]
}

然后,您可以为此生成 CSR。在此示例中,我使用 cfssl 生成 CSR:

cfssl genkey user.json  | cfssljson -bare client

您现在可以使用 kubectl 为您的集群提交 CSR:

cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: mfrank
spec:
  groups:
  - system:authenticated
  - mfrank
  request: $(cat client.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - client auth
EOF

请求字段是您的 csr 文件的 base64 编码版本。

查看您的 CSR:kubectl get csr

要批准它:

kubectl certificate approve mfrank

解码它:

kubectl get csr mfrank -o jsonpath='{.status.certificate}' | base64 -d > client.pem

您现在可以使用 client-key.pem 和 client.pem 来构建 kubeconfig。

然后,您可以在集群上创建 RBAC 角色绑定,分配给 –user=mfrank 或 –group=mfrank(假设您使用“O”:“mfrank”)


推荐阅读