问题标签 [mtls]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
374 浏览

istio - Istio:authn tls-check 和外部服务

在我的 istio 网格中,我配置了 mTLS,并且我正在使用一些外部到网格和外部到集群的服务:我可以通过创建禁用 TLS 的 trafficPolicy 来很好地连接它们,但是没有无论我做什么,我都无法让 authn tls-check 感到高兴,因为它总是显示与 mTLS 中的服务器和 HTTP 中的客户端发生冲突。

据我了解,这种情况下的“服务器”在网格外部,我似乎无法创建适用于它的策略来告诉 istio 该服务器没有使用 mTLS(显然,因为它在网格之外):是否有人能够进行设置,以便您为 mTLS 网格提供外部服务,并且 auth tls-check 显示 OK,同时为服务器和客户端禁用 mTLS?

0 投票
1 回答
540 浏览

kubernetes - Istio mTLS 中的 TLS 版本和密码

我已经在 Kubernetes 上使用 Istio 1.0.4 实现了 mTLS 以实现服务到服务的安全性。是否有配置来指定要与 Citadel 一起使用的密码和 TLS 版本?

0 投票
3 回答
1361 浏览

kubernetes - 如何在 ISTIO 中配置 TLS 发起?

Istio 不会通过 TLS 发起路由到外部 HTTPs 服务。

我有一个包含两个容器的 pod: - 应用程序 - ISTIO 代理

应用程序调用位于https://someurl.somedomain.com/v1/some-service上的外部第三方 API

应用程序通过调用http://someurl.somedomain.com/v1/some-service向该服务发送 HTTP 请求- 注意它是 HTTP 而不是 HTTPs。

然后我在 ISTIO 中配置了以下内容:

  • 将 HTTP 流量路由到端口 443 的虚拟服务:
  • 允许流量流出的服务入口。如您所见,我们指定服务在网格外部,我们打开了 443 和 80,两者都使用 HTTP,但 443 配置为 TLS 发起。

最后,我有一个将简单 TLS 应用于传出流量的目标规则:

出于某种原因,这不起作用,从我的应用程序容器调用服务时我得到 404,这表明流量没有通过 TLS 加密。

我使用 TLS 发起的原因是因为我需要在我的虚拟服务中应用重试,并且我只能使用 HTTP 路由来执行此操作,否则 ISTIO 无法看到请求并使用它。

两天来一直在挠头,需要一些帮助:-)

0 投票
1 回答
1071 浏览

kubernetes - Istio mTLS 仅在某些服务之间工作,即使 tls-check 为所有人打印 STATUS OK

我正在尝试在我已经使用 istio 的边车的网格中启用 mTLS。我遇到的问题是我只能获得一个工作连接,然后连接失败。

这就是我的 mTLS 实现失败(简化)现在设置服务的方式:

Istio IngressGateway -> NGINX pod -> API 网关 -> 服务 A -> [ 数据库 ] -> 服务 B

首先要注意的是,我使用 NGINX pod 作为负载均衡器来代理_将我的请求传递给我的 API 网关或我的前端页面。我尝试在没有 istio IngressGateway 的情况下保持它,但我无法让它工作。然后我尝试使用 Istio IngressGateway 并使用 VirtualService 直接连接到 API Gateway,但对我来说也失败了。所以我暂时就这样离开它,因为这是我的请求成功到达 API 网关的唯一方式。

需要注意的另一件事是,服务 A 首先连接到网格外的数据库,然后向网格内的服务 B 发出请求,并且启用了 mTLS。

NGINX、API 网关、服务 A 和服务 B 在启用 mTLS 的网格内,并且“istioctl authn tls-check”显示状态正常。

NGINX 和 API Gateway 位于名为"gateway"的命名空间中,数据库位于"auth"中,服务 A 和服务 B 位于另一个名为"api"的命名空间中。

Istio IngressGateway 现在位于命名空间“istio-system”中。

所以问题是,如果我将STRICT模式设置为网关命名空间并将PERMISSIVE设置为 api,那么一切正常,但是一旦我将STRICT设置为 api,我看到请求进入服务 A,但是它无法将请求发送到服务 B一个500。

这是失败时的输出,我可以在 Service A pod 的 istio-proxy 容器中看到:

虽然 ServiceB 中没有消息。

目前,我没有全局 MeshPolicy,我正在为每个命名空间设置 Policy 和 DestinationRule

政策:

目的地规则:

然后我有一些 DestinationRule 来禁用数据库的 mTLS(我在同一个命名空间中有一些其他服务,我想用 mTLS 启用)和 Kubernetes API

然后我有我的 IngressGateway 像这样:

最后,我的 VirtualServices:

我不明白的一件事是为什么我必须为我的 API 网关创建一个 VirtualService 以及为什么我必须在网关块中使用“网格”。如果我删除此块,我不会在 API Gateway 中收到我的请求,但如果我这样做了,它会起作用,我的请求甚至会到达下一个服务(服务 A),但不会到达下一个服务。

谢谢您的帮助。我真的坚持这一点。

ServiceA 的侦听器转储:

以 json 格式转储集群: https ://pastebin.com/73zmAPWg

以 json 格式转储侦听器: https ://pastebin.com/Pk7ddPJ2

从 serviceA 容器到 serviceB 的 curl 命令:

如果我禁用 mTLS,请求会使用 Curl 从 serviceA 获取到 serviceB

0 投票
1 回答
103 浏览

istio - 为什么在 Istio 中使用 mTLS 转发上一个请求的 Host Header 会返回 500?

所以我有一个可以工作的 mTLS 服务网格,直到其中一个服务使用一些标头操作逻辑进行了更新。这个逻辑是从服务获得的请求中获取标头,然后将这些标头添加到该服务向另一个请求发出的请求中。

有了这个逻辑,这个服务和下一个服务之间的 mTLS 就被破坏了,如果我激活了 PERMISSIVE 模式,连接就会像往常一样工作。

所以然后我去了这个服务的容器并对下一个服务做了一个 curl 请求,但是没有 Host Header 并且请求通过了。

因此,同样的请求,只是没有 Host 标头 mtls 可以工作,而使用 host 标头则不能。

我想知道发生这种情况的原因。它是否与 mTLS 以及两个服务如何相互信任有关?

谢谢

0 投票
1 回答
830 浏览

java - Java MTLS Subject 和 Issuer 顺序

我们正在升级我们自己和合作伙伴之间的连接,他们要求我们升级到 MTLS。我一直在调试低级java,

javax.net.debug=all 我可以看到握手成功。但是,合作伙伴会针对 Subject 和 Issuer 字段进行完整的字符串匹配,并与他们数据库中的某些字段进行比较。

我用过以下,

转储 java 的值。一个有趣的注释 openssl 以与 java 报告完全不同的顺序报告它们。

我现在一直在 Wireshark 中进行挖掘,我可以从那个级别看到握手,但是,据我所知,它似乎将名称翻译id-at-commonNamepkcs-9-at-emailAddress

有没有办法知道实际发送的是什么?

0 投票
2 回答
1603 浏览

security - 谷歌云平台 Cloud Endpoint SSL/TLS 相互握手 ESP

我正在努力在需要相互 SSL/TLS(服务器和客户端证书)的 GCP 上部署 API 解决方案。所以对于流量的入口(入口点)我发现kubernetes入口控制器有这种可能性(基于NGINX)。我对具有 ESP(可扩展服务代理,也是 kubernetes 下的 nginx 部署)的云端点感兴趣。

我在文档中的任何地方都找不到相互 SSL/TLS 是否可用于 ESP(云端点),有人知道答案吗?

0 投票
1 回答
1754 浏览

fastapi - 如何在 Starlette/FastAPI 中进行客户端证书验证 (mTLS)

我正在考虑使用 FastAPI 框架来实现相当简单的 API,但它需要支持 mTLS。AFAIK FastAPI 基于 Starlette。是否可以在 Starlette 中检查客户证书?

0 投票
0 回答
1746 浏览

kubernetes - 用于外部服务的 Istio Egress MTL

我目前(但未成功)尝试通过设置istio-egressgatewayMTL 来访问外部 K8s 集群服务。我正在遵循istio 文档中指定的说明,但没有按预期工作,而且我看不到我错在哪里。

环境

  • VMWare ESXi下的3个VM(1个master,2个Nodes)
  • 操作系统:CentOS 7,内核5.2.10-1.el7来自 elrepo
  • k8s 网络:cilium -1.6.4
  • 证书:cert-manager-0.12nowebhook
    • ClusterIssuer CA 证书 = 从私有 PKI 导入
  • K8s 外部负载均衡器:metallb-0.8.3

kubectlistio在K8s集群中使用

istio-egressgateway已按照istio 文档中的说明重新部署

这是应用.yaml几乎是示例的复制粘贴,稍作修改以通过其 IP 地址指向外部服务

当通过我们向外部服务进行查询时,curl我们应该得到 HTML web 代码,但是,它尝试使用 HTTP,而不是 HTTPS 来执行查询,为什么?. istio-proxy从调试器 pod 应该使用 Citadel 证书将 HTTP 转换为 HTTPS

验证时proxy-status我得到以下信息

根据官方istio文档,这可能意味着,要么是错误配置.yaml,要么是istio错误

检查端点时,一切看起来都很好

否则调试器 podistio-proxy日志会显示以下错误。但是外部证书不是 pod 级别的,而是重新编译的istio-egressgateway(这也没什么好玩的,我只是关注了 istio 文档),那么为什么 istio-proxy 正在寻找外部证书

Pilot 日志显示相同,istio-proxy调试器 pod 的容器一直在寻找外部服务 CA 证书,但该证书在egressgateway

istio-egressgateway一切接缝处都可以

当然,证书应该在istio-egressgateway. 我使用 cert-manager 集群颁发者为外部服务提供证书,就像 AC 和它的秘密已经在集群上

有没有人知道我错过了什么?这是配置错误还是错误?

任何帮助都将不胜感激,自从圣诞节假期之前我就一直坚持这一点

干杯

0 投票
1 回答
313 浏览

istio - 应用程序之间 mTLS 的最佳多集群配置

我想用 Istio 多集群配置 2 个 Kubernetes 集群,我正在考虑以下 2 个选项:

  1. 复制的控制平面 ( https://istio.io/docs/setup/install/multicluster/gateways/ )
  2. 共享控制平面(单网络)(https://istio.io/docs/setup/install/multicluster/shared-vpn/

出于可用性原因,我更愿意使用复制的控制平面,但我想到了以下问题:在这种情况下,应用程序之间的 mTLS 如何工作?

如果同一个集群的 2 个应用程序相互通信,并且启用了 mTLS,我可以创建一个如下所示的 AuthorizationPolicy:

app-a由 mTLS 提供的主体标识。

如果我们正在部署具有复制控制平面(版本 1)的多集群,我们将拥有如下内容:

具有复制控制平面的多集群

如何识别不同集群(cluster.global)中的应用程序?所有流量都通过网关,我的猜测是它永远不会从原始调用者那里读取主体,它会从网关中读取主体。这是正确的吗?

有没有办法解决这个问题?我可以获得复制的控制平面但没有网关部署吗?