从外部客户端到库伯内特斯集群内的服务器的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
,我看到没有返回,之后"
我的配置中有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: 编辑:我读了