Kubernetes TLS相关知识

文章楔子

Kubernetes内部所有组件间的通信都进行了双向验证,即服务端要确保客户端的身份可信,客户端也要确认服务端的身份可信。而这种信任是围绕三个根证书kubernetes-ca, etcd-ca, kubernetes-front-proxy-ca),以及由这三个根证书签发的多种服务端证书和客户端证书建立的。本文将简单介绍Kubernetes内部如何使用这些证书建立信任链。

证书

什么是证书

证书这个名词具有一定的误导性,严格的说,数字证书指的是证书和其私钥,也即我们所知道的cert + key。cert与key文件中各包含了一组非对称密钥的一半,使用key私钥加密过的数据,经由cert中的公钥即可解密。但是须知cert文件中并不只有公钥,还有明文存储的证书信息、签名等信息,以及用于校验这段明文内容的循环校验值,以确保这些值不会被没有私钥的中间人轻易修改。因此cert同时兼备了公钥,和传达对端信息(加密算法,身份,地址,CA机构等)的作用。

kubernetes中的证书

关于Kubernetes中各个证书的作用以及使用该证书的程序的详细信息,和可以查看该表格

根证书 CA

什么是CA

CA是用来签发证书的根证书,CA与普通证书本质上是相同的,CA与普通证书有一样的字段和扩展字段,一样的加密算法,也一样有cert和key两个文件。它们本质上是完全一样的。不同之处仅仅在于我们使用它的场合,我们既可以拿CA当证书用,也可以拿证书当CA用,但我们通常只用证书作证书,然后管为其他证书签名的那个证书叫CA。

所以我以为CA(Certificate Authority)其实应该叫Authority Certificate,因为最终CA本质上还是一个数字证书。

如何使用CA

同时拥有CA的cert和key文件的用户,能够验证某个证书是否包含本CA的签名 ,也能够使用该CA为一个证书签名,这会将该证书的CA机构字段值设置为该CA。

而只有CA的cert文件的用户则只能验证某个证书是否被本CA签名过。假设有CA的cert文件ca.crt,以及一个由该CA证书签名的证书的cert文件server.crt, 下面的命令可以验证server.crt是否是由ca.crt所属的CA证书签名过的证书。

$ openssl verify -CAfile ca.crt server.crt
server.crt: OK

Kubernetes中的根证书

一个标准的Kubernetes集群中有三种根证书,如果你使用kubeadm部署kubernetes集群,这三种根证书可以在/etc/kubernetes/pki中找到:

fileDefault CNdescription
ca.crt, ca.keykubernetes-ca一般用途的Kubernetes CA
etcd/ca.crt, etcd/ca.keyetcd-ca专用于与etcd相关功能的CA
front-proxy-ca.crt, front-proxy-ca.keykubernetes-front-proxy-ca专用于front-end proxy的CA

注意其中的Default CN值可以自定义。在1.13版本的kubeadm部署的kubernetes集群中,它们分别为kubernetes, etcd-cah和front-proxy-ca。查看CA的CN值的命令如下:

$ # 使用openssl工具
$ openssl x509 -text -noout -in /etc/kubernetes/pki/ca.crt|grep CN
        Issuer: CN = kubernetes
        Subject: CN = kubernetes

$ # 也可以使用go语言编写的cfssl工具查看。
$ cfssl-certinfo -cert /etc/kubernetes/pki/ca.crt
 {
   "subject": {
     "common_name": "kubernetes",
     "names": [
       "kubernetes"
     ]
   },
   "issuer": {
     "common_name": "kubernetes",
     "names": [
       "kubernetes"
     ]
   },
   "serial_number": "0",
   "not_before": "2019-02-13T01:12:38Z",
   "not_after": "2029-02-10T01:12:38Z",
   "sigalg": "SHA256WithRSA",
   "authority_key_id": "",
   "subject_key_id": ""
   "pem": "......"
 }

Kubeadm部署的kubernetes集群所使用的所有证书均由这三个根证书签发而来。

参考文档


文章已创建 23

2 个评论 在 “Kubernetes TLS相关知识

  1. 大佬,“什么是证书”下面叙述中“cert与key文件中各包含了一组对称密钥的一半”应该改为“未非对称密钥”吧。

回复 Stefan 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部