Kubernetes 使用哪个证书和密钥来签署证书签名请求?

问题描述 投票:0回答:2

我试图自动化为新用户签署 Kubernetes 证书的过程。
官方文档(here)建议使用 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命令的结果不一样。知道我错过了什么吗?

提前致谢!

kubernetes certificate kubectl x509
2个回答
1
投票

此刻的答案非常片面

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 来配置 PKI 基础设施 工具包 cfssl,然后使用它来引导证书颁发机构,以及 为以下组件生成 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”)


0
投票

创建 CSR 时,必须指定一个 signer,即在 kube-controller-manager 内运行的控制器循环。签名者将签署 CSR 并使用生成的证书更新

status
字段。

例如,要请求客户端证书以针对 kube-apiserver 进行身份验证,您需要使用

kubernetes.io/kube-apiserver-client
签名者。默认情况下,使用集群的 CA 私钥(通常位于
/etc/kubernetes/pki/ca.key
)。

(您可以通过将

--cluster-signing-kube-apiserver-client-key-file
标志传递给 kube-controller-manager 二进制文件来设置自己的标志;该标志将设置用于填充
KubeAPIServerClientSignerConfiguration.KeyFile
并签署 CSR 的私钥文件。)

以下清单为新的

john
用户创建 CSR:

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: john
spec:
  signerName: kubernetes.io/kube-apiserver-client
  usages: ["digital signature", "key encipherment", "client auth"]
  request: |
    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZEQ0NBVHdDQVFBd0R6RU5N
    QXNHQTFVRUF3d0VhbTlvYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0VQQURDQ0FRb0Nn
    Z0VCQUxLWnVjbHlLYUpqVzM0aUdRSEptazllUjc5VkRVdVVqbTNEYjNtUU9QaTVLSjlkCklsTloy
    b3l2YmdJVDBGcXF3amgyaWgvL1h5RnYyUU43OWM0TW1MUTBsSFZ2T0V1bDBaZFpBSGNUVk5yZWt4
    SHgKOVVtSlBtb3Bwbm5yYjhuYS90NnpMc0xMbkE0NHZteEZyay9kYlN3V2t2aE1sSktVOStSbUdN
    NEJGOEw0NzR1VQp4MERvSDIwaXEzNDNmTUVCeEc0N3hpQzVLbXFIdFlUeG9JOXBjMzlJTTVtTE8w
    YXlzSHJHTjFQbXpzVGpVMU1DCkNhNzZKSVhGRFZHckFlUFk1eS96R2NPdzZjYkVFZDhpMGlPNDJy
    T3RFK1hER1puNk13N1JGWTkxMDgxMVhaZEUKd3RqY1F5Z05TdDcvOFpIU3J3TCtXditmbFhlYmRV
    V2EyQVVMTllFQ0F3RUFBYUFBTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQllGbVBHSmRpcGtx
    a0tPRlJxWjRXM09ESmlLaEF5K1NkVDZMNTFhSnVuenNWKzVTMXlaUFhjCndSeUdLRkdGWHd3YVdh
    UGllQVZuSkUvUHdzQ0d2RlhJSDl0dmcwZ1hrZjNxWG96dTc3N29PNC9aU21aOUxwOGYKTE13R3Vs
    dWVLVjhMalhRZWtkQXdtMmQzaUJOMGxVbllNK2FNVTlhWC8xeEl4aG02ZWNjRXJKa0txdCtZbGt6
    YQpROHhTWlBsamMydXhCbllrMFdPUjZOdmpYNW9Zell4WVU4UWdLQjgyNnBhdFl4OTZuZG14Vy8r
    bkpPSkJNaUNOCnpsSUJzNzhOdWgrZlFmOGlnSjZwUFNub1RaNlFRa3R4czk5NFEzV09ONkRtSFli
    THN1V21zNCsrTHZFWFZUeTQKbjJTN3owQ3NsOVdlT3o5QytsaXEvcy9XRDl5dEZESmsKLS0tLS1F
    TkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==

申请后,您可以批准CSR并显示生成的证书:

$ kubectl certificate approve john
$ kubectl get csr john -o jsonpath='{.status.certificate}' | base64 -d | openssl x509 -noout -text

(您可以通过查找通用名称 (CN) 字段来查看用户名。)

© www.soinside.com 2019 - 2024. All rights reserved.