OpenSSL连接:警告内部错误

时间:2017-04-16 10:50:00

标签: ssl openssl

我使用SNI在单个服务器上运行100个HTTPS服务。 (实际上,我无法访问它们。这是一项任务。我所知道的只是他们的域名N.xxx.yy,其中N的范围是00到99.)分配的目标是评估每个服务器的每个连接的安全性。因此,某些服务器包含过期的证书,带有错误CN的证书等。

我的问题是我无法通过某些服务器上的握手。我已经使用OpenSSL在C ++中编写了自己的应用程序,但我也尝试使用openssl s_client。这是我连接到服务器的方式:

openssl s_client -host N.xxx.yy -port 443 -verify 1 -servername N.xxx.yy -CAfile assignment-ca.pem

这就是我得到的:

139625941858168:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:s3_pkt.c:1493:SSL alert number 80
139625941858168:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:

在Wireshark中,我看到客户已发送ClientHello,服务器已回复ServerHello(选择TLSv1.2和ECDHE-RSA-AES256-GCM-SHA384)后跟Certificate,然后它发送给我{ {1}}消息包含Alert

在尝试不同的事情之后,我发现如果我使用Internal Error (80)s_client运行-tls1,我可以成功通过握手。 -tls1_1不起作用。更奇怪的是,即使TLSv1.2已经谈判,通过Chrome / Firefox /任何其他浏览器的连接也会成功。从我看到的情况来看,Chrome发送的密码列表与我或-tls1_2不同,但即使修改了密码列表以匹配Chrome中的密码列表(并确保服务器选择s_client),它也不会工作要么。 Chrome正在发送这些TLS扩展程序,我不会这样做,但大多数看起来都是空的:

ECDHE-RSA-AES128-GCM-SHA256

有人可以解释一下这里发生了什么吗?不幸的是,我无法在服务器端调试它,所以这就是我所知道的。

更新:

在使用伪造的Unknown 47802 renegotiation_info Extended Master Secret signed_certificate_timestamp status_request Application Layer Protocol Negotiation channel_id Unknown 6682 消息后,我设法将其追踪到ClientHello分机。我的应用signature_algorithms提供了s_client,但如果我删除这些内容并仅保留SHA384 + {RSA,DSA,ECDSA},就像Chrome一样,它可以正常收到SHA256 + {RSA,DSA,ECDSA}消息。可能是服务器不支持它,但它没有提供有意义的错误消息,它只是意外结束并给我这个内部错误?

更新2:

我找到了为什么它适用于RFC5246中1.2之前的TLS版本的答案。上一次更新的问题仍然存在。

Server Key Exchange

1 个答案:

答案 0 :(得分:0)

因为您写了-tls1_2 does not work我假设您和/或服务器使用较旧的openssl库。写这篇文章时的当前版本是1.1.0e

自0.9.8以来,有一些修复方法,通常可以在较旧的系统上看到。

对于Version 1.0.1,有这个修复,听起来像你的问题:

 `Some servers which support TLS 1.0 can choke if we initially indicate
 support for TLS 1.2 and later renegotiate using TLS 1.0 in the RSA
 encrypted premaster secret. As a workaround use the maximum permitted
 client version in client hello, this should keep such servers happy
 and still work with previous versions of OpenSSL.`

也许notable

Don't allow TLS 1.2 SHA-256 ciphersuites in TLS 1.0, 1.1 connections.

所以我建议更新你的openssl版本,如果服务器无法控制,我会坚持你已经找到的设置。