首页 > 解决方案 > SSL:SSLV3_ALERT_HANDSHAKE_FAILURE sslv3 警报握手失败 (_ssl.c:833)

问题描述

我在 Ubuntu 18.04 和 openssl 版本 1.1.0g 中运行的 python 中有一个简单的 TLS 客户端。客户端支持单个密码套件。尝试连接到 TLS 1.0 服务器时出现错误。服务器不支持密码套件。我知道错误的原因很可能是由于缺乏密码套件不匹配,但在这种情况下,我正在为用户寻找更有意义的错误。我目前遇到的错误指向 SSLv3,客户端和服务器都与 SSLv3 没有任何关系。客户端也禁用 SSLv3 和服务器。这是错误:

[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:833) 

我的问题是:例如,我需要一个更好的错误消息(缺少密码套件不匹配或与密码套件问题相关的类似内容)。有没有?当然,我可以编写自己的消息,但套接字连接可能由于各种原因而失败,而且我不能犯一个总是说“密码套件不匹配”的一般错误。

这是客户端脚本:

import socket,ssl
import itertools

context = ssl.SSLContext()

context.verify_mode = ssl.CERT_NONE
context.check_hostname = False

ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256"
context.set_ciphers(ciphers)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

domainName = "privatedomain.com"
sslSocket = context.wrap_socket(s, server_hostname = domainName)

try:
    sslSocket.connect((domainName, 443))
except (ssl.SSLError, ssl.SSLEOFError, ssl.CertificateError,ssl.SSLSyscallError, ssl.SSLWantWriteError, ssl.SSLWantReadError,ssl.SSLZeroReturnError) as e:
    print("Error: ",e)
sslSocket.close()

标签: pythonsslopenssltls1.2pyopenssl

解决方案


迟到的答案,但希望有帮助。. .

客户端和服务器必须就传输层版本达成一致,连接才能成功。考虑第一次见到一个人。该人(客户)以问候的姿态向您(服务器)伸出手。如果您刚刚看到这个人没有洗手就从厕所里出来,并且您看到(和/或闻到)不受欢迎的东西,您将不会伸出手作为回报。

它与 SSL 握手类似。客户说“嘿,我想通过 TLS v1.0 进行通信”。精明的服务器管理员知道 TLS v1.0 不安全,他们在服务器上禁用了它——所以服务器响应客户端,“不,但是版本 1.3 怎么样?” (即:“先去洗手”)。如果客户端接受(洗手),则接受握手并建立连接。如果客户端拒绝,服务器会继续要求较低的版本(“那么一加仑 Purell 怎么样?”),直到客户端接受或服务器没有其他版本可提供(走开)。

基本上,握手被设计为使用客户端和服务器都支持的最高版本。

这个页面有一个很好的客户端和服务器版本表(大约在“SSL 上下文”部分的一半:

 https://docs.python.org/3/library/ssl.html

请注意,TLS v1.0 不再被认为是安全的(谷歌“POODLE 攻击”)。如果您的服务器支持它,请尽快禁用它。


推荐阅读