(二)K8S证书介绍与CA证书的创建及分发

一 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
上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 沪ICP备2022009235号 沪公网安备31011802005110号 青浦区尚茂路798弄 联系方式-13697081366