Kubernetes学习之路(二)K8S证书介绍与CA证书的创建及分发
_____egon新书来袭请看:https://egonlin.com/book.html
一 k8s证书介绍
证书原理简介:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
k8s证书:https://www.cnblogs.com/linhaifeng/articles/15167217.html
证书原理简介
服务端:制作一对秘钥,私钥和公钥,公钥发给所有的客户端 #1、客户端----发送数据给---》服务端: 如何保证客户端发往服务端的数据不被窃取呢??? 客户端用公钥加密 服务端用私钥解密 #2、服务端---发送数据给---》客户端 如何保证发送的数据不被篡改呢??? 服务端先将明文数据做hash校验,得到一个hash值称之为digest摘要 然后将hash值用私钥加密,得到的内容称之为数字签名,即signature 然后数字签名附在明文数据中发送给客户端 客户端收到后,用公钥解开,就得到了数字签名,然后用相同的hash算法计算明文数据,如果得到的值与数据签名一致,证明数据没有被篡改 #3、有人会将自己伪造成服务端,然后制作密钥对,将客户端的公钥替换成自己的,然后用自己的私钥加密数据发给客户端,为了防止这件事,怎么做呢??? (1)服务端需要把自己的公钥去CA中心这个权威机构认证一下,CA中心会用自己的私钥将服务端的公钥加密,得到的内容称之为数字证书Digital Certificate (2)服务端发送数据会附上数字签名与CA中心发布的数字证书一起给客户端 (3)客户端会从CA中心中获取公钥来解密,从而拿到服务端的准确公钥,然后用准确的公钥来解密服务端数据。。。(浏览器基本都内置各大权威机构的CA公钥) 补充1:数字证书包含如下内容: 1.申请者公钥 2.申请者组织和个人信息 3.签发机构CA信息,有效时间,序列号等 4.以上信息的签名 补充2:根证书又名自签名证书,也就是自己给自己颁发的证书。CA(Certificate Authority)被称为证书授权中心, k8s中的ca证书就是根证书。
二 CA证书的创建及分发
先在manager管理节点创建好ca证书,然后分发给所有其他节点,以后其他节点就可以用该ca证书来为自己签发数字证书了
ca这个根证书可以为其他人签发的证书有服务端和客户端两种,服务端主要用于别人来访问自己,客户端则用于自己去访问别人
如下我们的ca-config.json中的server auth并且client auth,指的是我们的这个ca既可以签发服务端的证书、又可以签发客户端的证书
#1、在manager节点安装CFSSL cd /usr/local/src wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 chmod +x cfssl* # 增加执行权限 mv cfssl-certinfo_linux-amd64 /opt/kubernetes/bin/cfssl-certinfo mv cfssljson_linux-amd64 /opt/kubernetes/bin/cfssljson mv cfssl_linux-amd64 /opt/kubernetes/bin/cfssl #2、把manager节点上的cfssl命令文件到所有其他节点上 #!/bin/bash for i in 'master01' 'master02' 'master03' 'node01' 'node02' 'node03' 'manager' do scp /opt/kubernetes/bin/cfssl* root@$i:/opt/kubernetes/bin done #3、在manager节点上创建用来生成CA文件的JSON配置文件 cd /usr/local/src mkdir ssl && cd ssl cat > ca-config.json << EOF { "signing": { "default": { "expiry": "175200h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "175200h" } } } } EOF ==============》知识点《============= ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;此实例只有一个kubernetes模板。 signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE; server auth:表示client可以用该 CA 对server提供的证书进行验证; client auth:表示server可以用该CA对client提供的证书进行验证; client certificate: 客户端使用,用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端。 server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver。 peer certificate: 双向证书(server auth与client auth同时开启),用于etcd集群成员间通信(用这种就行了,省事,比如上面创建的kubernetes就属于这类) 也可以如下配置 { "signing": { "default": { "expiry": "175200h" }, "profiles": { "server": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "client auth" ] }, "peer": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } #4、在manager节点上创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件 cat > /usr/local/src/ssl/ca-csr.json << EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "ops" } ] } EOF ==============》知识点《============= CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法 C: Country, 国家 ST: State,州,省 L: Locality,地区,城市 O: Organization Name,组织名称,公司名称 OU: Organization Unit Name,组织单位名称,公司部门 #5、在manager节点上生成CA证书(ca.pem)和密钥(ca-key.pem) cd /usr/local/src/ssl/ #生成证书和密钥,注意命令末尾不要有空格,会生成ca.csr,ca.pem,ca-key.pem cfssl gencert -initca ca-csr.json | cfssljson -bare ca 其中ca-key.pem是ca的私钥,ca.csr是一个签署请求,ca.pem是CA证书,是后面kubernetes组件会用到的RootCA。 #6、把管理节点生成的证书分发到所有其他节点 #!/bin/bash for i in 'master01' 'master02' 'master03' 'node01' 'node02' 'node03' 'manager' do scp ca.csr ca.pem ca-key.pem ca-config.json root@$i:/opt/kubernetes/ssl/ done