ssl双向认证简单来说就是服务端需要认证客户端证书,客户端也需要认证服务端证书。通常应用于安全等级很高的内部系统,保证能访问系统的客户端都是授信任的。
证书
通常我们可以使用ca自签来颁发服务端和客户端证书,值得注意的是生成服务端签名申请(csr)中的Common Name值需要填写真实访问的域名,最后生成的p12证书需要导入到客户端浏览器
具体步骤可以参照下面的文章
openssl生成ca证书配置ssl双向认证
openssl签署自己的泛域名(通配符)证书
traefik配置
因为是双向认证,为了和普通的单向认证区分,我们新配一个entry point名为secure
optional = false 表示要验证客户端证书是否经过ca签名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| defaultEntryPoints = ["http", "https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.secure] address = ":8443" [entryPoints.secure.tls] [entryPoints.secure.tls.ClientCA] files = ["/etc/traefikssl/clientca.crt"] optional = false [[entryPoints.secure.tls.certificates]] certFile = "/etc/traefikssl/bxr.cn.crt" keyFile = "/etc/traefikssl/bxr.cn.key"
|
k8s ingress
在ing中使用Annotations标记使用secure entry point
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: traefik.ingress.kubernetes.io/frontend-entry-points: secure name: kubernetes-dashboard namespace: kube-system spec: rules: - host: k8s.bxr.cn http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 9090
|
访问 https://k8s.bxr.cn:8443 浏览器就会要求你提供证书(之前生成的p12证书),没有证书不能访问。