当前位置: 首页 > 知识库问答 >
问题:

通过Istio入口网关的TLS握手失败(tlsMode=passthrough)

黄俊智
2023-03-14

从外部客户端到库伯内特斯集群内的服务器的TLS握手失败。这是关于理解为什么。

我已经配置了一个Istio入口网关,以通过端口15433上接收的TLS,并将其路由到端口433上的服务器。

当客户端尝试TLS握手时,入口网关日志显示活动,但不显示服务器日志,也不显示istio代理日志。

TLS客户端:

openssl s_client \ 
        -connect [redacted]-[redacted].us-west-2.elb.amazonaws.com:15443 \ 
        -servername myservice.mynamespace \ 
        -CAfile /path/to/ca.cert \ 
        -cert /path/to/cert.pem \ 
        -key /path/to/cert.key <<< "Q"

日志

CONNECTED(00000006) 
140090868934296:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177: 
--- 
no peer certificate available 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 0 bytes and written 298 bytes 
--- 
New, (NONE), Cipher is (NONE) 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
No ALPN negotiated 
SSL-Session: 
    Protocol  : TLSv1.2 
    Cipher    : 0000 
    Session-ID:  
    Session-ID-ctx:  
    Master-Key:  
    Key-Arg   : None 
    PSK identity: None 
    PSK identity hint: None 
    SRP username: None 
    Start Time: 1600987862 
    Timeout   : 300 (sec) 
    Verify return code: 0 (ok) 

Istio入口网关日志:

"- - -" 0 - "-" "-" 298 0 1069 - "-" "-" "-" "-" "192.168.101.136:443" outbound|443||myservice.mynamespace.svc.cluster.local 192.168.115.141:42350 192.168.115.141:15443 192.168.125.206:23298 myservice.mynamespace - 

其中192.168.101.136是myservice pod的IP,192.168.115.141是ingressgateway pod的IP。

基于IP,这意味着客户端连接到达了网关,网关似乎已经应用了virtualservice路由,并记录了它正在将其转发到pod。看起来很正常,除了pod上的istio代理没有显示任何活动,也没有服务器日志(尽管服务器没有记录传输层发生的事情)。

AFAIK当以下端口转发TLS握手成功时,服务器已正确配置TLS:

kubectl port-forward -n mynamespace service/myservice 4430:443 &
openssl s_client \
        -connect localhost:4430 \
        -CAfile /path/to/ca.cert \ 
        -cert /path/to/cert.pem \ 
        -key /path/to/cert.key <<< "Q"
# I get back a TLS session ID, looks good.

因此,这表明istio的网关或virtualservice配置存在问题。

盖特韦:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: mygateway
  namespace: mynamespace
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 15443
        name: tls-passthrough
        protocol: TLS
      tls:
        mode: PASSTHROUGH
      hosts:
      - "*"

虚拟服务:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myservice
  namespace: mynamespace
spec:
  hosts:
  - "*" 
  gateways:
  - mygateway
  tls:
    - match:
      - port: 15443
        sniHosts:
        - myservice.mynamespace
      route:
      - destination:
          host: myservice
          port:
            number: 443

库伯内特斯服务:

apiVersion: v1
kind: Service
metadata:
  name: myservice
  namespace: mynamespace
  labels:
    app: myservice
spec:
  selector:
    app: myservice
  ports:
    - protocol: TCP
      port: 443
      targetPort: 443
      name: grpc-svc

更新:实际上,来自客户端的TLS流量确实到达了服务器端,我通过在服务器端执行tcpdump port 443并在运行openssl s_client命令时查看数据包来确认这一点。不清楚为什么pod上的istio代理没有显示这一点,这也不能解释握手失败的原因。

我注意到别的东西。传递-msg标志到openssls_client,我看到没有返回,之后"

共有1个答案

郭浩穰
2023-03-14

我的配置中有2个错误:

>

  • 在我的库伯内特斯服务配置中。不幸的是,我的TCP端口443的名称是grpc-svc,这打破了TLS直通。将此端口重命名为tcp-svc可解决此问题。

    我不应该使用入口端口15443,这似乎是为其他事情保留的。在ingress网关上打开另一个端口9444,然后在网关上配置端口9444,就像我在问题中配置端口15443一样(即配置TLS直通),然后将虚拟服务配置为路由9444,就像我配置虚拟服务路由一样15433在我的问题。

    这两种操作都允许来自外部客户端openssl s_client通过入口成功地与kubernetes服务进行TLS握手。

  •  类似资料:
    • 我需要与外部服务连接,而且我的客户端身份验证有问题。该服务需要证书、用户名和密码以及请求。 我正在使用Windows Server 2008 R2。 我已经收到带有证书的PKCS#7包并导入: 本地计算机/个人的SSL证书(仅含公钥) 中间CA和根CA到本地计算机/受信任的RootCertificationAuthorities 我已经在Windows注册表中启用了TLS 1.0、1.1、1.2客

    • 我们很难与远程机器(如PayPal vb)建立https连接谁从我们的系统中禁用了SSL3协议。Net应用程序。HttpWebRequest实例的GetResponse方法出现以下异常。 请求被中止:无法创建SSL/TLS安全通道。 当我们使用WireShark深入并跟踪网络日志时,我们看到远程机器返回以下错误 TLSv1。2警报(级别:致命,描述:握手失败)握手失败40 更有趣的情况是,当我尝试

    • 我正在尝试向支持TLS 1.2的服务器发帖——至少当我在浏览器中执行GET时,我可以验证通信是否使用TLS 1.2,以及证书是否由证书颁发机构验证。然而,当我试图使用AFIOS 9.0(13A4305g)/Xcode 7-beta4将代码发布到该服务器时,我的握手失败了。 失败: 我错过什么了吗?我怎样才能挖得更深?假设这是服务器的问题,而不是代码的问题——我怎么能窥探到呢?

    • 在JDK 11下使用TLS 1.3原则上是可行的。然而,一旦在两个并发线程中建立连接,两个线程的初始握手都会失败。 这显然是一个已知的问题,应该已经解决了: Oracle JDK 11.0.2 OpenJDK 11.0.3 使用OpenJDK,这应该是固定的: 或者甚至是OpenJDK(这是今天在AdoptOpenJDK. net上可用的最新选项): 这是正式修复的,但我似乎无法让它工作。 这是怎

    • 我不知道我到底需要在哪里包含客户机证书。现在,我的第一个问题是我不信任服务器。我尝试使用默认的Java密钥库文件(cacerts),其中包含Thawte和Digicert,这些是我试图与之通信的服务器的根权限。我使用

    • 我有一个在kubernetes pod中运行的应用程序(在我的本地docker桌面上,启用kubernetes),监听端口8080。然后我有以下kubernetes配置 这个很好用。但我想把443端口改成其他端口,比如8443(因为我将有多个网关)。当我有这个,我不能再访问应用程序了。是否有一些配置我遗漏了?我猜我需要配置Istio来接受8443端口?我使用以下命令安装了istio: 编辑:我读了