kubernetes-guide/content/trick/certs/sign-certs-with-cfssl.md

2.8 KiB
Raw Blame History

使用 cfssl 生成证书

搭建各种云原生环境的过程中,经常需要生成证书,比如最常见的 etcd本文记录使用 cfssl 快速生成证书的方法。

安装 cfssl

方法1: 去 release 页面下载,然后解压安装。

方法2: 使用 go install 安装:

go install github.com/cloudflare/cfssl/cmd/cfssl@latest
go install github.com/cloudflare/cfssl/cmd/cfssljson@latest

创建 CA 证书

由于各个组件都需要配置证书,并且依赖 CA 证书来签发证书,所以我们首先要生成好 CA 证书以及后续的签发配置文件:

cat > ca-csr.json <<EOF
{
  "CN": "Kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "SiChuan",
      "L": "ChengDu",
      "O": "Kubernetes",
      "OU": "CA"
    }
  ]
}
EOF

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "876000h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ],
        "expiry": "876000h"
      }
    }
  }
}
EOF

生成的文件中有下面三个后面会用到:

  • ca-key.pem: CA 证书密钥
  • ca.pem: CA 证书
  • ca-config.json: 证书签发配置,用 CA 证书来签发其它证书时需要用

csr 文件字段解释:

  • CN(Common Name): apiserver 从证书中提取该字段作为请求的用户名 (User Name)
  • names[].O(Organization): apiserver 从证书中提取该字段作为请求用户所属的组 (Group)

由于这里是 CA 证书,是签发其它证书的根证书,这个证书密钥不会分发出去作为 client 证书,所有组件使用的 client 证书都是由 CA 证书签发而来,所以 CA 证书的 CN 和 O 的名称并不重要,后续其它签发出来的证书的 CN 和 O 的名称才是有用的。

为 ETCD 签发证书

这里证书可以只创建一次,所有 etcd 实例都共用这里创建的证书:

cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "*.karmada-system.svc",
    "*.karmada-system.svc",
    "*.karmada-system.svc.cluster",
    "*.karmada-system.svc.cluster.local"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "SiChuan",
      "L": "Chengdu",
      "O": "etcd",
      "OU": "etcd"
    }
  ]
}
EOF

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=kubernetes \
  etcd-csr.json | cfssljson -bare etcd

hosts 需要包含 etcd 被访问时用到的地址,可以用 IP ,域名或泛域名。

会生成下面两个重要的文件:

  • etcd-key.pem: etcd 密钥。
  • etcd.pem: etcd 证书。