前端双向认证配置
平台部署后默认打开了 TLS 服务端(单向)认证,本文介绍如何在已有 服务端认证的情况下,开启客户端验证(双向)认证。
整个云平台运行在 Kubernetes 之上,前端服务通过 ingress 暴露出来,我们使用了开源的 traefik 组件来负责 ingress 的实现,所以在 traefik 上设置客户端认证。
生成证书
下面使用生成自签名证书的方式来配置,如果已经有证书机构签发的服务端和客户端证书,可以忽略这个步骤。
生成 CA
$ openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=My Cert Authority'
生成 Server 服务端证书
基于上面生成的 CA 签发 server 证书:
$ openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=mydomain.com'
$ openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
生成 Client 客户端证书
基于上面生成的 CA 签发 client 证书:
$ openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=My Client'
$ openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
上传证书到 Kubernetes
# 上传 ca 到 kube-system 命令空间
$ kubectl -n kube-system create secret generic ca-secret --from-file=ca.crt=ca.crt
# 上传 server 证书到 onecloud 命名空间
$ kubectl -n onecloud create secret generic tls-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.key
修改前端 default-web ingress
前端是通过 onecloud 命令空间里面的 default-web ingress 访问的,把前端使用的 tls 证书换成 tls-secret 。
$ kubectl edit ingress -n onecloud default-web
...
tls:
# 修改这个 secretName 为 tls-secret
- secretName: tls-secret
...