1 前言
几天前我用家用PC做宿主机(Windows10 HyperV)搭建了一套 K8S 高可用 Demo 系统,见前文《二进制部署 K8S 高可用集群》。后来发现在访问其 Dashboard 的时候只有 firefox 可以正常浏览 ,而Chrome和Safari 均会报证书错误。
从浏览器返回的信息看应该是自建CA没有被官方机构认证以及证书条目不匹配所致。
今天我们来尝试解决这个问题。
2 重新生成 Dashboard SSL 证书
上一次我们用的是 cfssl ,今天我们用回 openssl 。
2.1 创建目录 ~/openssl 并进入
mkdir ~/openssl
cd ~/openssl
2.2 用openssl 生成一把KEY
openssl genrsa -out dashboard.key 2048
Generating RSA private key, 2048 bit long modulus
...............+++
.............+++
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 内容如下:
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = SH
localityName = Locality Name (eg, city)
localityName_default = ShangHai
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = RJ
commonName = RJtestK8S
commonName_max = 64
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = k8s.rjtest #对应的域名
DNS.3 = k8s.rjtest.com
IP.1 = 192.168.3.104 #对应的IP
IP.2 = 192.168.3.105
IP.3 = 192.168.3.106
IP.4 = 192.168.3.107
IP.5 = 192.168.3.108
IP.6 = 192.168.3.109
IP.7 = 192.168.3.110
2.4 创建CSR文件
执行下面的命令创建证书请求文件
openssl req -new -out dashboard.csr -key dashboard.key -config openssl.cnf
这样我们得到一个名为 dashboard.csr 的证书请求文件,我们可以用如下的命令查看其内容:
openssl req -text -in dashboard.csr
2.5 自签名并创建证书
有了了证书CSR,私KEY,以及openssl 配置文件,接下来我们就可以创建证书:
openssl x509 -req -days 3650 -in dashboard.csr -signkey dashboard.key -out dashboard.crt -extensions v3_req -extfile openssl.cnf
用如下的命令查看一下刚刚生成的证书文件:
openssl x509 -text -in dashboard.crt
3 在K8S 中为 Dashboard 应用新证书
3.1 删除旧的证书secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
3.2 创建新的证书secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
3.3 删除正在运行的 pod 使新secret生效
# pod 被删除后,K8S会立即重建
kubectl get po -n kubernetes-dashboard
kubectl delete po kubernetes-dashboard-7b544877d5-bnzch -n kubectlnetes-dashboard
kubectl delete po dashboard-metrics-scraper-6b4884c9d5-b5frv -n kubernetes-dashboard
4 在浏览器端信任证书
一般情况下,只要使用了新的证书,Chrome 虽然还会报证书错误但是可以跳过报错正常浏览页面了,但在我的MAC电脑中还是无法跳过报错正常浏览。初步判断还是因为自签发的 CA 不被信任的问题。解决的办法只有一个,那就是让系统信任刚刚签发的证书。
4.1 导入证书
将刚刚生成的 dashboard.crt 证书文件下载到本地并导入系统
4.2 信任该证书(需要输入系统密码)
4.3 再次用Chrome or Safari 打开K8S dashboard
大功告成。
—-END—-