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

 

posted @ 2021-08-20 17:39  linhaifeng  阅读(3018)  评论(0编辑  收藏  举报