文章楔子
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中找到:
file | Default CN | description |
ca.crt, ca.key | kubernetes-ca | 一般用途的Kubernetes CA |
etcd/ca.crt, etcd/ca.key | etcd-ca | 专用于与etcd相关功能的CA |
front-proxy-ca.crt, front-proxy-ca.key | kubernetes-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集群所使用的所有证书均由这三个根证书签发而来。
大佬,“什么是证书”下面叙述中“cert与key文件中各包含了一组对称密钥的一半”应该改为“未非对称密钥”吧。
已更正,感谢提醒