python - 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()
解决方案
迟到的答案,但希望有帮助。. .
客户端和服务器必须就传输层版本达成一致,连接才能成功。考虑第一次见到一个人。该人(客户)以问候的姿态向您(服务器)伸出手。如果您刚刚看到这个人没有洗手就从厕所里出来,并且您看到(和/或闻到)不受欢迎的东西,您将不会伸出手作为回报。
它与 SSL 握手类似。客户说“嘿,我想通过 TLS v1.0 进行通信”。精明的服务器管理员知道 TLS v1.0 不安全,他们在服务器上禁用了它——所以服务器响应客户端,“不,但是版本 1.3 怎么样?” (即:“先去洗手”)。如果客户端接受(洗手),则接受握手并建立连接。如果客户端拒绝,服务器会继续要求较低的版本(“那么一加仑 Purell 怎么样?”),直到客户端接受或服务器没有其他版本可提供(走开)。
基本上,握手被设计为使用客户端和服务器都支持的最高版本。
这个页面有一个很好的客户端和服务器版本表(大约在“SSL 上下文”部分的一半:
https://docs.python.org/3/library/ssl.html
请注意,TLS v1.0 不再被认为是安全的(谷歌“POODLE 攻击”)。如果您的服务器支持它,请尽快禁用它。
推荐阅读
- r - 将一行的一个值与同一列的所有行的平均值进行比较
- docker - 我想创建多个容器,然后创建不同的 pod 并将容器放入 pod
- python - match.call() 有什么作用?
- python-3.6 - 执行 cx_Freeze setup.py 后,cmd 中没有任何反应
- python - 使 tfp.sts.fit_with_hmc 更快
- android - 在 RecyclerView 中滑动删除时如何添加具有红色背景颜色的布局
- javascript - 使用 Gulp 从数组中批量重命名图像
- swift - 切换到 macOS Catalina 后 Modulemap 无法编译 - tcp_var.h
- angular - 错误类型错误:无法读取未定义的属性“焦点”
- java - 您可以将变量传递给 FXML 中的 Insets 吗?