我遇到了 SSL 错误!?
从 19.10 升级到 20.04 并出现此错误:
ssl.SSLError: [SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1108)
它是由调用 oanda.com 的 rest API 的 python 脚本引发的。
使用 Postman 或 OANDA 的 Java 应用程序连接到服务均能正常工作。此外,在 RPi 上运行 Python 脚本也正常,只需进行一次更改,如下所示!
20.04 - OpenSSL 1.1.1f 2020 年 3 月 31 日
RPi - OpenSSL 1.1.1d 2019 年 9 月 10 日
问题也出现在 RPi 上,研究发现有几个建议可以在文件中更改设置CipherString = DEFAULT@SECLEVEL=2
。CipherString = DEFAULT@SECLEVEL=1
这/etc/ssl/openssl.cnf
在 RPi 上有效,但在 Ubuntu 20.04 上无效。
关于如何解决这个问题有什么想法吗?
错误报告:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 665, in urlopen
httplib_response = self._make_request(
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 376, in _make_request
self._validate_conn(conn)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 996, in _validate_conn
conn.connect()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 352, in connect
self.sock = ssl_wrap_socket(
File "/usr/lib/python3/dist-packages/urllib3/util/ssl_.py", line 370, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/lib/python3.8/ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "/usr/lib/python3.8/ssl.py", line 1040, in _create
self.do_handshake()
File "/usr/lib/python3.8/ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1108)
答案1
我在从 18.04 LTS 升级到 20.04 LTS 后尝试连接到 Exchange 服务器时遇到了此错误。原因是默认上游 Debian OpenSSL 设置变得更加安全。在 OpenSSL 中,CipherString
现在设置为DEFAULT@SECLEVEL=2
此更改的背景/原因详述如下:https://weakdh.org/
理想情况下,应该提高服务器的安全性,而不是在客户端实施这种变通方法。然而,在许多情况下,这是不可能的。
我可以通过创建一个来调整连接使用的密码来解决这个问题SSL上下文。以下是代码示例(用于 SMTPS 连接 - 发送电子邮件):
connection = smtplib.SMTP(
config['Email']['host'] + ':' + config['Email']['port'])
context=ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# Either of the following context settings worked for me - choose one
# context.set_ciphers('HIGH:!DH:!aNULL')
context.set_ciphers('DEFAULT@SECLEVEL=1')
connection.starttls(context=context)
connection.login(config['Email']['user'], config['Email']['pw'])
connection.sendmail(config['Email']['sender'], recipients, msg.as_string())
connection.close()
重要的行是这些 - 选择以下调整之一CipherString
:
context.set_ciphers('HIGH:!DH:!aNULL')
context.set_ciphers('DEFAULT@SECLEVEL=1')
但如果可能的话,最好修复服务器!
要使上述内容适应 urllib3,请参阅以下答案:
答案2
按照本文所述降低 SSL 安全级别后,我的项目就能正常运行了。