安全网关
Ingress 流量控制任务6描述了如何配置入口网关以向外部公开 HTTP 服务。此任务描述如何使用 TLS 或 mTLS 公开安全的 HTTPS 服务。
准备工作
参考安装指南8部署 Istio。
部署 httpbin9 示例:
对于 macOS 用户,请验证您是否使用通过 LibreSSL11 库编译的
curl
:如果上述命令输出的是如图所示的 LibreSSL 版本,则
curl
命令应按照此任务中的说明正确运行。 否则,请尝试使用curl
的其他实现,例如在 Linux 机器上。
生成客户端和服务器证书和密钥
对于此任务,您可以使用自己喜欢的工具来生成证书和密钥。 下面的命令使用 openssl12。
创建用于服务签名的根证书和私钥:
为
httpbin.example.com
创建证书和私钥:创建第二组相同类型的证书和密钥:
为
helloworld.example.com
生成证书和私钥:生成客户端证书和私钥:
配置单机 TLS 入口网关
为入口网关创建 Secret:
配置入口网关:
首先,使用 servers:
为 443 端口定义一个网关,并将 credentialName
的值设置为 httpbin-credential
。
该值与 Secret 的名称相同。TLS 模式的值应为 SIMPLE
。
接下来,通过定义相应的虚拟服务来配置网关的入口流量路由:
最后,按照这些说明
设置访问网关的 INGRESS_HOST
和 SECURE_INGRESS_PORT
变量。
向
httpbin
服务发送 HTTPS 请求:httpbin
服务将返回 418 I’m a Teapot13 代码。通过删除网关的 Secret 然后使用不同的证书和密钥重新创建它来更改网关的凭据:
使用新的证书链和
curl
来访问httpbin
服务:如果您使用之前的证书链来访问
httpbin
,则会失败:
为多个主机配置 TLS 入口网关
您可以为多个主机(例如 httpbin.example.com
和 helloworld.example.com
)配置入口网关。
入口网关配置有与每个主机相对应的唯一凭据。
通过删除并使用原始证书和密钥重新创建 Secret 来恢复上一个示例中的
httpbin
凭据:启动
helloworld-v1
示例:创建
helloworld-credential
Secret:使用
httpbin.example.com
和helloworld.example.com
主机配置入口网关:
为 443 端口定义一个具有两个服务器部分的网关。将每个端口上的 credentialName
值分别设置为 httpbin-credential
和 helloworld-credential
。将 TLS 模式设置为 SIMPLE
。
通过定义相应的虚拟服务来配置网关的流量路由。
在 443 端口上配置具有两个监听器的 Gateway
。将每个端口的监听器的 certificateRefs
的名字分别设置为 httpbin-credential
和 helloworld-credential
。
为 helloworld
服务配置网关的流量路由:
向
helloworld.example.com
发送 HTTPS 请求:向
httpbin.example.com
发送一个 HTTPS 请求,仍然返回一个 HTTP 41815:
配置双向 TLS 入口网关
您可以扩展网关的定义以支持双向 TLS16。
通过删除其 Secret 并创建一个新的来更改入口网关的凭据。服务器使用 CA 证书来验证其客户端,我们必须使用名称
ca.crt
来持有 CA 证书。配置入口网关:
更改网关的定义以将 TLS 模式设置为 MUTUAL
。
因为 Kubernetes Gateway API 目前不支持
Gateway
中的双向 TLS 终止,所以我们使用 Istio 特定的选项 gateway.istio.io/tls-terminate-mode: MUTUAL
来配置它:
尝试使用之前的方法发送 HTTPS 请求,看看它是如何失败的:
将客户端证书和私钥传递给
curl
并重新发送请求。将带有--cert
标志的客户证书和带有--key
标志的私钥传递给curl
:
更多信息
密钥格式
Istio 支持读取几种不同的 Secret 格式,以支持与各种工具的集成,例如 cert-manager19:
- 带有
tls.key
和tls.crt
的 TLS Secret,如上所述。对于双向 TLS,ca.crt
可以作为密钥。 - 如上所述,TLS Secret 具有密钥
tls.key
和tls.crt
。 对于双向 TLS,单独的通用 Secret 名为<secret>-cacert
,带有cacert
密钥。 例如,httpbin-credential
具有tls.key
和tls.crt
,而httpbin-credential-cacert
具有cacert
。 - 带有
key
和cert
键的通用 Secret。对于双向 TLS,cacert
可以作为密钥。 - 带有
key
和cert
键的通用 Secret。对于双向 TLS,名为<secret>-cacert
的带有cacert
键的通用 Secret。 例如,httpbin-credential
有key
和cert
,httpbin-credential-cacert
有cacert
。 cacert
键值可以是一个 CA 捆绑包,由串联的各个 CA 证书组成。
SNI 路由
HTTPS Gateway
将在转发请求之前对其配置的主机执行 SNI20
匹配,这可能会导致某些请求失败。有关详细信息,
请参阅配置 SNI 路由。
问题排查
检查
INGRESS_HOST
和SECURE_INGRESS_PORT
环境变量的值。根据以下命令的输出,确保它们具有有效值:确保
INGRESS_HOST
的值是一个 IP 地址。在某些云平台(例如 AWS)中,您可能会得到一个域名而不是 IP 地址。 此任务需要一个 IP 地 址,因此您需要使用类似以下的命令进行转换:检查网关控制器的日志以获取错误消息:
验证已在
istio-system
命名空间中成功创建 Secret:httpbin-credential
和helloworld-credential
应当显示在 Secret 列表中。检查日志以验证入口网关代理已将密钥/证书对推送到入口网关:
日志应显示
httpbin-credential
Secret 已添加。如果使用双向 TLS, 那么httpbin-credential-cacert
Secret 也应该出现。 验证日志显示网关代理接收到来自入口网关的 SDS 请求,资源的名称是httpbin-credential
, 并且入口网关获得了密钥/证书对。如果使用双向 TLS,日志应显示密钥/证书已发送到入口网关, 网关代理收到带有httpbin-credential-cacert
资源名称的 SDS 请求,并且入口网关获得了根证书。
清理
- 删除网关配置和路由:
删除 Secret、证书和密钥:
关闭
httpbin
和helloworld
服务: