我能够使用 Haproxy 实现 SSL 卸载。产品太棒了,我很欣赏这种能力!
话虽如此,我需要进行相互 TLS,但对于它如何与入口控制器配置图一起工作有点困惑。
经历此引用我已经创建了客户端证书、中级证书和根证书。
需要注意的是,我目前正在终止负载均衡器上的 ssl 证书(来自 letsencrpt)。
但是,客户端证书和组织 CA 与我现在指定为 SSL 的 lesencrypt tls/ssl 证书不同;这有关系吗?
因此,我的第一个问题是,是否必须将 ssl 证书设置为将签署客户端和服务器证书的 CA,或者我是否只能使用我在说明中创建的新证书。
设置配置图。
这是我感到困惑的部分。
您可以设置server-ca
,server-crt
但我认为这不适用于此,因为在 SSL 卸载后,无需检查任何内容。但是,我确实希望通过 SSL 终止进行 mTLS。
因此有一个配置client-ca
设置客户端证书颁发机构,使 HAProxy 能够检查客户端证书(TLS 身份验证),从而启用客户端 mTLS。注意:应启用 ssl-offloading 才能使 TLS 身份验证正常工作。
在这种情况下,客户端是我想要的实际客户端,即设备/前端。而不是充当后端服务器客户端的负载均衡器。
当我查看这是如何设置的:
frontend mysite
bind 192.168.56.20:80
bind 192.168.56.20:443 ssl crt /etc/haproxy/certs/ssl.crt verify required ca-file /etc/haproxy/certs/intermediate-ca.crt ca-verify-file /etc/haproxy/certs/root-ca.crt
http-request redirect scheme https unless { ssl_fc }
default_backend apiservers
是否可以使用控制器配置映射执行下面列出的相同操作?除了我看到的标志/配置之外,在应用客户端 mTLS 的方法中还有很多事情要做。有没有办法在不使用配置映射的情况下在 kubernetes 中实现这一点?
ssl 参数为该侦听器启用 SSL 终止。crt 参数标识 PEM 格式的 SSL 证书的位置。该证书应包含公钥证书和私钥。
您可以通过向受信任的客户端提供他们在连接时必须出示的证书来限制谁可以访问您的应用程序。如果您在绑定行中添加验证必需参数,HAProxy 将检查这一点,如下所示:
- ssl 参数启用 HTTPS
- crt 参数指定服务器 SSL 证书,你通常会从 Let's Encrypt 等证书提供商处获取该证书
- verify required 参数要求客户端发送客户端证书
- ca-file 参数指定中间证书,我们将使用该证书验证客户端的证书是否已由我们组织的 CA 签名
- ca-verify-file 参数(在 HAProxy 2.2 中引入)包含根 CA 证书,允许 HAProxy 在 SERVER HELLO 消息中向客户端发送用于验证的较短 CA 列表,但将上级 CA(例如根 CA)排除在该列表之外。HAProxy 要求使用此参数设置根 CA,否则将其包含在 middle-ca.crt 文件中(与旧版本的 HAProxy 兼容)。
此外,我现在想要使用 letsencrypt 而不是私有 CA 的原因是我无法每 60 - 90 天更新一次设备证书。这样效率不高。在这种情况下,请让我知道其他情况,我认为最好使用真正的密钥/证书提供商,或者在开发测试中使用 openssl 证书,就像 HAProxy 指令中那样。
这很奇怪,但你真的必须思考一下这些抽象中的“客户端”是什么,因为我永远不会将其用于普通的网页登录,而是用于服务器到服务器的通信,从这个意义上讲,这个服务器是这个服务器的客户端。或者在我的情况下,这个设备是这个负载均衡器的客户端。
答案1
客户端证书验证是 TLS 握手的一部分,因此您不能让 TLS 终止发生在负载均衡器上,然后让客户端证书检查发生在下游的某个地方。
这基本上就是中间人攻击:-)
在这种情况下,您的选择是在 HAProxy 级别处理 SSL 终止或在负载均衡器级别执行客户端证书检查(如果可能)。
如果您决定采用 HAProxy 路线,我发现这篇文章在我开始使用 mTLS 时非常有用。这是一篇较旧的文章,但仍然非常有用。
https://www.loadbalancer.org/blog/client-certificate-authentication-with-haproxy/