我使用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
答案 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版本,如果服务器无法控制,我会坚持你已经找到的设置。