【云原生 · Kubernetes】生成CA根证书、公钥、私钥指令(数字证书)

举报
念舒C.ying 发表于 2022/09/02 10:34:11 2022/09/02
【摘要】 为确保安全,==kubernetes== 系统各组件需要使用 ==x509== 证书对通信进行加密和认证。CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。CA 证书是集群所有节点共享的,只需要创建一次,后续用它签名其它所有证书。本文档使用 ==CloudFlare== 的 PKI 工具集 ==cfssl==创建所有证书。注意:如果没有特殊指...

为确保安全,==kubernetes== 系统各组件需要使用 ==x509== 证书对通信进行加密和认证。
CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。
CA 证书是集群所有节点共享的,只需要创建一次,后续用它签名其它所有证书。
本文档使用 ==CloudFlare== 的 PKI 工具集 ==cfssl==创建所有证书。
注意:如果没有特殊指明,本文档的所有操作均在 qist 节点上执行。

1 安装 cfssl 工具集

mkdir -p /opt/k8s/bin

wget
https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl_1.4.1_linux_amd64
mv cfssl_1.4.1_linux_amd64 /opt/k8s/bin/cfssl

wget
https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssljson_1.4.1_linux_am
d64
mv cfssljson_1.4.1_linux_amd64 /opt/k8s/bin/cfssljson

wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfsslcertinfo_1.4.1_linux_amd64
mv cfssl-certinfo_1.4.1_linux_amd64 /opt/k8s/bin/cfssl-certinfo

chmod +x /opt/k8s/bin/*
export PATH=/opt/k8s/bin:$PATH

2 创建配置文件

CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等):

  • 创建etcd K8S ca 目录
mkdir -p /opt/k8s/cfssl/{etcd,k8s}
mkdir -p /opt/k8s/cfssl/pki/{etcd,k8s}
# 创建工作目录
mkdir -p /opt/k8s/work
  • 全局配置文件生成
cd /opt/k8s/work
cat > /opt/k8s/cfssl/ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
  },
  "profiles": {
    "kubernetes": {
      "usages": [
        "signing",
        "key encipherment",
        "server auth",
        "client auth"
    ],
    "expiry": "876000h"
   }
  }
 }
}
EOF
  • signing : 表示该证书可用于签名其它证书(生成的 ca.pem 证书中 CA=TRUE );
  • server auth : 表示client 可以用该该证书对 server 提供的证书进行验证;
  • client auth : 表示 server 可以用该该证书对client 提供的证书进行验证;
  • "expiry": “876000h” : 证书有效期设置为 100 年;

3 创建证书签名请求文件

  • etcd 证书签名请求文件
cd /opt/k8s/work
cat > /opt/k8s/cfssl/etcd/etcd-ca-csr.json <<EOF
{
  "CN": "etcd",
  "key": {
      "algo": "rsa",
      "size": 2048
  },
  "names": [
      {
          "C": "CN",
	      "ST": "GuangDong",
		  "L": "GuangZhou",
		  "O": "k8s",
		  "OU": "Qist"
  }
],
  "ca": {
    "expiry": "876000h"
  }
}
EOF
  • kubernetes 证书签名请求文件
cd /opt/k8s/work
cat > /opt/k8s/cfssl/k8s/k8s-ca-csr.json <<EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
},
"names": [
  {
        "C": "CN",
        "ST": "GuangDong",
        "L": "GuangZhou",
        "O": "k8s",
        "OU": "Qist"
  }
 ],
"ca": {
"expiry": "876000h"
 }
}
EOF
  • CN:Common Name : kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法;
  • O:Organization :kube-apiserver 从证书中提取该字段作为请求用户所属的组(Group)
  • kube-apiserver 将提取的 User、Group 作为 RBAC 授权的用户标识;

注意:

  1. 不同证书 csr 文件的 CN、C、ST、L、O、OU 组合必须不同,否则可能出现 PEER’S CERTIFICATE HAS AN INVALID SIGNATURE 错误;
  2. 后续创建证书的 csr 文件时,CN 都不相同(C、ST、L、O、OU 相同),以达到区分的目的;

下表可帮助您创建证书请求。

Name 姓名 描述 示例
Country Name 国家名称 代表国家的两个字母 ISO 缩写。 CN(中国)
State or Province Name 州或省 组织所在州或省的名称。此名称不可使用缩写。 ZJ(浙江)
Locality Name 所在地名称 组织所在城市的名称。 HZ(杭州)
Organization Name 组织名称 组织的法定全称。请勿缩写组织名称。 百度、腾讯、网易
Organizational Unit Name 组织部门 可选,用于提供额外的组织信息。 开发、测试、市场营销
Common Name 公用名 别名记录的完全限定域名。如果两者不能精确匹配,那么您会收到一条证书名称检测警告。 www.yourdomain.com
Email Address 电子邮件地址 服务器管理员的电子邮件地址 someone@yourdomain.com

4 生成 CA 证书和私钥

  • 生成 etcd CA 证书和私钥
cd /opt/k8s/work
cfssl gencert -initca /opt/k8s/cfssl/etcd/etcd-ca-csr.json | \
cfssljson -bare /opt/k8s/cfssl/pki/etcd/etcd-ca
ls -la /opt/k8s/cfssl/pki/etcd/*-ca*
root@Qist ~# ls /opt/k8s/cfssl/pki/etcd/*-ca*
/opt/k8s/cfssl/pki/etcd/etcd-ca-key.pem /opt/k8s/cfssl/pki/etcd/etcd-ca.csr
/opt/k8s/cfssl/pki/etcd/etcd-ca.pem
  • 生成 kubernetes CA 证书和私钥
cd /opt/k8s/work
cfssl gencert -initca /opt/k8s/cfssl/k8s/k8s-ca-csr.json | \
cfssljson -bare /opt/k8s/cfssl/pki/k8s/k8s-ca
root@Qist ~# ls /opt/k8s/cfssl/pki/k8s/*-ca*
/opt/k8s/cfssl/pki/k8s/k8s-ca-key.pem /opt/k8s/cfssl/pki/k8s/k8s-ca.csr
/opt/k8s/cfssl/pki/k8s/k8s-ca.pem

5 分发CA证书文件

  • etcd ca 证书分发
cd /opt/k8s/work
scp -r /opt/k8s/cfssl/pki/etcd/etcd-ca* root@192.168.2.175:/apps/etcd/ssl
scp -r /opt/k8s/cfssl/pki/etcd/etcd-ca* root@192.168.2.176:/apps/etcd/ssl
scp -r /opt/k8s/cfssl/pki/etcd/etcd-ca* root@192.168.2.177:/apps/etcd/ssl
  • kubernetes ca 证书分发
# k8s 连接etcd 使用ca 证书
scp -r /opt/k8s/cfssl/pki/etcd/etcd-ca.pem root@192.168.2.175:/apps/k8s/ssl/etcd/
scp -r /opt/k8s/cfssl/pki/etcd/etcd-ca.pem root@192.168.2.176:/apps/k8s/ssl/etcd/
scp -r /opt/k8s/cfssl/pki/etcd/etcd-ca.pem root@192.168.2.177:/apps/k8s/ssl/etcd/
# K8S 集群ca 证书
scp -r /opt/k8s/cfssl/pki/k8s/k8s-ca* root@192.168.2.175:/apps/k8s/ssl/k8s
scp -r /opt/k8s/cfssl/pki/k8s/k8s-ca* root@192.168.2.176:/apps/k8s/ssl/k8s
scp -r /opt/k8s/cfssl/pki/k8s/k8s-ca* root@192.168.2.177:/apps/k8s/ssl/k8s

期待下次的分享,别忘了三连支持博主呀~
我是 念舒_C.ying ,期待你的关注~💪💪💪

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。