我istio在 GKE 集群上部署了 2 个启用的服务。
istio版本是1.1.5并且 GKE 已开启v1.15.9-gke.24
istio 已安装 global.mtls.enabled=true
serviceA 正确沟通
serviceB 显然有 TLS 相关问题。
我启动了一个未istio启用的部署,仅用于测试并执行到这curl两个服务端点的测试 pod 。
/ # curl -v serviceA
* Rebuilt URL to: serviceA/
* Trying 10.8.61.75...
* TCP_NODELAY set
* Connected to serviceA (10.8.61.75) port 80 (#0)
> GET / HTTP/1.1
> Host: serviceA
> User-Agent: curl/7.57.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: application/json
< content-length: 130
< server: …Run Code Online (Sandbox Code Playgroud) 对于混合云用例,我们正在研究 EnvoyProxy 是否适合作为跨本地防火墙移动数据的解决方案。预期的设置如下:
使用 Envoy 将数据路由到上游集群已有详细记录。但是,我们想知道 Envoy 是否能够在两个代理实例之间设置 TLS 连接并在两个方向上使用该通道。限制是该 TLS 连接只能从一个方向(出站)建立。
如果这是可能的,有人可以指出我正确的方向吗?
谨致问候, 乔斯特
对于普通 TLS,客户端将检查我正在通信的服务器实际上是否位于与 CN 匹配的 FQDN 上,因此,如果证书用于不同的域,则 TLS 默认情况下不应工作,因为该证书不适用于该站点。
对于 mTLS,当服务器检查客户端证书时,它是否可以以某种方式检查客户端地址是否与 CN 匹配,或者只是检查证书与密钥是否匹配以及证书在客户端是否受信任?即,如果我使用互联网上任何计算机上的正确客户端密钥/证书,如果服务器配置为信任该证书,服务器是否应该连接,或者是否需要客户端以某种方式位于特定地址?
我在尝试与 .NET 客户端建立双向身份验证时遇到连接协商失败。
这种情况发生在远程服务器显着增加授权 CA 列表之后。
虽然通过设置更高的值可以在任何 Java 客户端中轻松解决此问题jdk.tls.maxHandshakeMessageSize,但我找不到针对 .NET 的相同解决方法。
(.NET Framework 4.7.2) 和 Internet Explorer 11会出现此问题System.Net.HttpClient。
System.Net.Security.SslStream
Istio 不会通过 TLS 发起路由到外部 HTTPs 服务。
我有一个包含两个容器的 pod: - 应用程序 - ISTIO 代理
应用程序调用位于https://someurl.somedomain.com/v1/some-service 的外部第三方 API
应用程序通过调用http://someurl.somedomain.com/v1/some-service向该服务发送 HTTP 请求- 注意它是 HTTP 而不是 HTTPs。
然后我在 ISTIO 中配置了以下内容:
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: someservice-vs
spec:
hosts:
- someurl.somedomain.com
http:
- match:
- port: 80
route:
- destination:
host: someurl.somedomain.com
port:
number: 443
timeout: 40s
retries:
attempts: 10
perTryTimeout: 4s
retryOn: gateway-error,connect-failure,refused-stream,retriable-4xx,5xx
Run Code Online (Sandbox Code Playgroud)
apiVersion: …Run Code Online (Sandbox Code Playgroud) 我有一个托管 REST 回显服务的 Kubernetes 集群 (AKS)。该服务通过 HTTP 运行良好。我正在使用 NGINX 入口来路由流量。我现在想通过 HTTPS 和 mTLS 设置此服务,因此强制客户端指定一个证书以便能够与回声服务进行通信。这是一个 POC,所以我使用的是自签名证书。
我需要设置哪些 Kubernetes 组件才能实现这一点?我阅读了 NGINX 文档,但无法理解是否需要在 Kubernetes 集群中创建证书颁发机构/证书管理器并使用它来配置入口服务以执行 mTLS 步骤。我可以在入口处终止 SSL(在执行 mTLS 之后)并允许从入口到回声服务的不安全通道。
我希望有这种设置经验的人可以提供一些指导。
谢谢!
背景
使用以下http客户端
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我的假设 在管理连接池中的连接时,选择连接时,应在选择连接池中的相同连接之前考虑客户端证书。我不希望使用 clientB TLS 证书连接 clientA,反之亦然。
问题 这个假设正确吗?
场景1)
我将每条路由的最大连接数设置为 2。我调用客户端 A 的 MTLS 安全服务器。(池中的一个连接) 我调用客户端 A 的 MTLS 安全服务器。(池中两个连接)这不应该重用第一个连接吗?
场景2)
我将每条路由的最大连接数设置为 2。我为客户端 A 调用 MTLS 安全服务器。(池中的一个连接)我为客户端 B 调用 MTLS 安全服务器。(池中两个连接)
然而,第二次调用似乎没有执行完整的握手,而是使用了 clientA 证书。
我希望第二次调用需要完整的握手,并且连接无论如何都不相关。
这是预期的行为吗?我在这里遗漏了一些明显的东西吗?
更新了更简单的测试用例
我们现在使用 http 上下文,因此我附上了更新的日志。我也简化了测试用例,现在它每次都连接到同一服务器两次,应该使用不同的客户端证书。
该应用程序使用 Spring Boot,并具有单个 RestTemplate 和单个 httpClient。
它使用 PrivateKeyStrategy 来决定与服务器通信时使用什么私钥/证书。
第一个连接使用密钥别名“e2e_transport_key_id_franek”(您将在日志中看到这一点)
第二个连接应使用别名“e2e_transport_key_id_pdw”(日志中从未见过)
我们建立的第二个连接应该使用别名为“e2e_transport_key_id_pdw”的密钥/证书,但是会话已恢复,请参见第 448 行尝试恢复会话。这意味着我们无法使用 PrivateKeyStrategy 来选择要使用的客户端证书。
如何强制客户端连接不重复使用我们打算使用不同客户端证书的连接的会话?
我正在使用 WINDOWS 中的 CURL 命令。我已经发布了下面的命令。我还发布了命令的结果。在我看来,服务器在发送证书之前终止连接。但我可能错了。有什么想法为什么没有发送证书吗?
curl -v --cert C:\Users\myFolder\Downloads\hs_test_cert.pem --key C:\Users\myFolder\Downloads\hst_test_key.pem https://myAPIGEEhost.apigee.net/MyBackendName_CCDA_API?apikey=MyAssignedAPIKey
* Trying 00.00.00...
* TCP_NODELAY set
* Connected to myAPIGEEhost.apigee.net (00.00.00) port 443 (#0)
* schannel: SSL/TLS connection with myAPIGEEhost.apigee.net port 443 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 203 bytes...
* schannel: sent initial handshake data: sent 203 bytes
* schannel: SSL/TLS connection with myAPIGEEhost.apigee.net port 443 (step 2/3)
* schannel: failed to receive handshake, need more data
* …Run Code Online (Sandbox Code Playgroud) 我在 k8s 上托管了一个 Spring Boot 应用程序,并在应用程序本身上强制执行了 mTLS。通过在 Ingress 级别执行 SSL 终止,然后再次将证书转发到 springboot pod,我可以在连接上执行 mTLS。
问题是,Liveness 和 Readiness 探测器目前不确定如何在就绪/活跃度探测器中发送证书?
任何帮助,将不胜感激。