1 前言

几天前我用家用PC做宿主机(Windows10 HyperV)搭建了一套 K8S 高可用 Demo 系统,见前文《二进制部署 K8S 高可用集群》。后来发现在访问其 Dashboard 的时候只有 firefox 可以正常浏览 ,而Chrome和Safari 均会报证书错误。
WX20210119-103724.png
从浏览器返回的信息看应该是自建CA没有被官方机构认证以及证书条目不匹配所致。
今天我们来尝试解决这个问题。

2 重新生成 Dashboard SSL 证书

上一次我们用的是 cfssl ,今天我们用回 openssl 。

2.1 创建目录 ~/openssl 并进入

  1. mkdir ~/openssl
  2. cd ~/openssl

2.2 用openssl 生成一把KEY

  1. openssl genrsa -out dashboard.key 2048
  2. Generating RSA private key, 2048 bit long modulus
  3. ...............+++
  4. .............+++
  5. e is 65537 (0x10001)

2.3 创建 openssl 配置文件 openssl.cnf

这里我们用 OpenSSL 配置带有SubjectAltName的ssl请求,对于多域名,只需要一个证书就可以保护非常多的域名。SubjectAltName 是 X509 Version 3 (RFC 2459)的扩展,允许ssl证书指定多个可以匹配的名称。
SubjectAltName 可以包含 email 地址、ip地址、正则匹配DNS主机名 等等。ssl 这 样的一个特性叫做:SubjectAlternativeName(简称:san),由于我们的K8S Dashboard 有多个对应的IP可访问,我们需要用到这个SSL特性 san。
对于一个通用的ssl证书请求文件(CSR),openssl不需要很多操作。因为我们可能需要添加一个或者两个SAN到我们CSR,我们需要在openssl配置文件中添加一些东西:你需要告诉openssl创建一个包含x509 V3扩展的CSR,并且你也需要告诉 openssl 在你的CSR中包含 subject alternative names 列表。创建一个openssl配置文件 openssl.cnf 内容如下:

  1. [req]
  2. distinguished_name = req_distinguished_name
  3. req_extensions = v3_req
  4. [req_distinguished_name]
  5. countryName = Country Name (2 letter code)
  6. countryName_default = CN
  7. stateOrProvinceName = State or Province Name (full name)
  8. stateOrProvinceName_default = SH
  9. localityName = Locality Name (eg, city)
  10. localityName_default = ShangHai
  11. organizationalUnitName = Organizational Unit Name (eg, section)
  12. organizationalUnitName_default = RJ
  13. commonName = RJtestK8S
  14. commonName_max = 64
  15. [ v3_req ]
  16. # Extensions to add to a certificate request
  17. basicConstraints = CA:FALSE
  18. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  19. subjectAltName = @alt_names
  20. [alt_names]
  21. DNS.1 = k8s.rjtest #对应的域名
  22. DNS.3 = k8s.rjtest.com
  23. IP.1 = 192.168.3.104 #对应的IP
  24. IP.2 = 192.168.3.105
  25. IP.3 = 192.168.3.106
  26. IP.4 = 192.168.3.107
  27. IP.5 = 192.168.3.108
  28. IP.6 = 192.168.3.109
  29. IP.7 = 192.168.3.110

2.4 创建CSR文件

执行下面的命令创建证书请求文件

  1. openssl req -new -out dashboard.csr -key dashboard.key -config openssl.cnf

WX20210119-105500@2x.png
这样我们得到一个名为 dashboard.csr 的证书请求文件,我们可以用如下的命令查看其内容:

  1. openssl req -text -in dashboard.csr

image.png

2.5 自签名并创建证书

有了了证书CSR,私KEY,以及openssl 配置文件,接下来我们就可以创建证书:

  1. openssl x509 -req -days 3650 -in dashboard.csr -signkey dashboard.key -out dashboard.crt -extensions v3_req -extfile openssl.cnf

WX20210119-105426@2x.png
用如下的命令查看一下刚刚生成的证书文件:

  1. openssl x509 -text -in dashboard.crt

image.png

3 在K8S 中为 Dashboard 应用新证书

3.1 删除旧的证书secret

  1. kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard

3.2 创建新的证书secret

  1. kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

3.3 删除正在运行的 pod 使新secret生效

  1. # pod 被删除后,K8S会立即重建
  2. kubectl get po -n kubernetes-dashboard
  3. kubectl delete po kubernetes-dashboard-7b544877d5-bnzch -n kubectlnetes-dashboard
  4. kubectl delete po dashboard-metrics-scraper-6b4884c9d5-b5frv -n kubernetes-dashboard

WX20210119-103500@2x.png

4 在浏览器端信任证书

一般情况下,只要使用了新的证书,Chrome 虽然还会报证书错误但是可以跳过报错正常浏览页面了,但在我的MAC电脑中还是无法跳过报错正常浏览。初步判断还是因为自签发的 CA 不被信任的问题。解决的办法只有一个,那就是让系统信任刚刚签发的证书。

4.1 导入证书

将刚刚生成的 dashboard.crt 证书文件下载到本地并导入系统
WX20210119-110448@2x.png

4.2 信任该证书(需要输入系统密码)

WX20210119-111438@2x.png
WX20210119-111502@2x.png

4.3 再次用Chrome or Safari 打开K8S dashboard

WX20210119-111638.png
WX20210119-112028@2x.png
大功告成。

—-END—-