我在运行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)
我的问题是:我需要一个更好的错误消息,例如(缺少密码套件不匹配或类似的东西与密码问题相关)。有没有?当然我可以编写自己的消息,但套接字连接可能由于各种原因而失败,我不能发出一般性错误,总是说" ciphersuite mismatch"。
这是客户端脚本:
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()
答案 0 :(得分:0)
从客户端的角度来看,不可能获得另一条消息而不是服务器发送的消息,在您的情况下为$sMetadata = preg_replace('/\R/', "\r\n", $sMetadata);
。例如,错误消息记录在RFC 2246 7.2。
您在邮件中看到SSLv3的原因是您可能发送了SSLv3 Hello,这是允许协商TLS 1.0或更高版本协议的。
答案 1 :(得分:0)
最新答案,但希望会有所帮助。 。
客户端和服务器都必须在传输层版本上达成一致,连接才能成功。考虑第一次见面。此人(客户)以问候的姿势将手伸向您(服务器)。如果您只是看到那个人不洗手就从厕所里出来,并且看到(和/或闻到)不想要的东西,您将不会伸出手。
与SSL握手类似。客户端说“嘿,我想通过TLS v1.0进行通信”。精通服务器的管理员知道TLS v1.0是不安全的,并且已在服务器上禁用了TLS v1.0,因此服务器会响应客户端,“否,但1.3版呢?” (即:“先洗手”)。如果客户端接受(洗手),则接受握手并建立连接。如果客户端拒绝,服务器将继续要求较低版本(“加仑的Purell呢?”),直到客户端接受或服务器没有其他版本可以提供(走开)。
基本上,握手旨在使用客户端和服务器都支持的最高版本。
此页面上有一个漂亮的客户端和服务器版本表(在“ SSL上下文”部分中大约位于一半以下:
https://docs.python.org/3/library/ssl.html
请注意,TLS v1.0不再被认为是安全的(Google“ POODLE攻击”)。如果您的服务器支持,请尽快将其禁用。
答案 2 :(得分:0)
对我来说:
urllib.error.URLError: <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1123)>
意思是我在做这个
cipherstr = 'MEDIUM:!aNULL:!eNULL'
context = ssl._create_unverified_context()
context.set_ciphers(cipherstr)
注释掉 set_ciphers
,它现在可以工作了。
要检查的其他事项:确保您的 OpenSSL 版本为 new enough。