首页 文章

OpenSSL连接:警告内部错误

提问于
浏览
2

我使用SNI在单个服务器上运行100个HTTPS服务 . (实际上,我不是't have access to them. It'的一项任务 . 我所知道的只是他们的域名 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 然后它发送了包含 Internal Error (80)Alert 消息 .

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

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} ,但如果我删除这些并保留 SHA256 + {RSA,DSA,ECDSA} ,就像Chrome一样,它可以正常工作,并且我成功收到 Server Key Exchange 消息 . 可能是服务器以某种方式不支持它,但它没有提供有意义的错误消息,它只是意外结束并给我这个内部错误?

更新2:

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

Note: this extension is not meaningful for TLS versions prior to 1.2.
   Clients MUST NOT offer it if they are offering prior versions.
   However, even if clients do offer it, the rules specified in [TLSEXT]
   require servers to ignore extensions they do not understand.

1 回答

  • 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-Version,如果服务器无法控制,我会坚持你已经找到的设置 .

相关问题