是否可以配置 curl 和/或 wget 以拒绝小于或等于 1024 位的 DH 密钥交换。作为功能测试,使用 curl/wgethttps://dh1024.badssl.com/应该会失败。
我无法在相应的手册页和多次 Google 搜索中找到该问题的答案。
提前致谢。
答案1
IME wget 通常使用 OpenSSL 构建(尽管 GnuTLS 更像 FSFish),并且 OpenSSL 1.1.0 增加了库范围的“安全级别”,可以使用用于密码套件的 API 进行设置。第一个 1.1.x 版本是在 2016 年发布的,因此现在并非所有系统都在使用它,尽管许多系统都在使用它。例如在我的 Ubuntu 18.04 上:
$ openssl version; wget https://dh1024.badssl.com/
OpenSSL 1.1.1 11 Sep 2018
--(timestamp)-- https://dh1024.badssl.com/
Resolving dh1024.badssl.com (dh1024.badssl.com)... 104.154.89.105
Connecting to dh1024.badssl.com (dh1024.badssl.com)|104.154.89.105|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 573 [text/html]
Saving to: 'index.html'
...
但经过如下/etc/ssl/openssl.cnf
编辑https://stackoverflow.com/questions/62357205/openssl-cant-establish-ssl-connection-because-unsupported-protocol(还有几个我当时没发现的)但是使用@SECLEVEL=2(而不是1)来禁止DHE-1024:
$ wget https://dh1024.badssl.com/
--(timestamp)-- https://dh1024.badssl.com/
Resolving dh1024.badssl.com (dh1024.badssl.com)... 104.154.89.105
Connecting to dh1024.badssl.com (dh1024.badssl.com)|104.154.89.105|:443... connected.
OpenSSL: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
Unable to establish SSL connection.
较新版本的 wget 允许您直接在命令行上执行此操作,--ciphers=
但我的版本不允许;请查看手册以了解您的版本。(或者,如果您确实想要,您可以自己构建一个较新的版本。)
curl 支持许多 SSL/TLS 实现,并且在使用方面有更多变化。 Ubuntucurl 确实使用 OpenSSL,并且一直以来都有命令行选项,因此:
$ curl -qI https://dh1024.badssl.com
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Thu, 10 Sep 2020 07:08:14 GMT
Content-Type: text/html
Content-Length: 573
Last-Modified: Tue, 24 Mar 2020 00:15:54 GMT
Connection: keep-alive
ETag: "5e79513a-23d"
Cache-Control: no-store
Accept-Ranges: bytes
$ curl -qI --ciphers DEFAULT:@SECLEVEL=2 https://dh1024.badssl.com
curl: (35) error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
请注意,对于其他服务器,自 2010 年左右以来,wget 和 curl(不仅是 OpenSSL,还有其他服务器)使用的库通常会同时提供 DHE 和 ECDHE 密码套件,并且自 2015 年以来大多数服务器都支持 ECDHE 并且更喜欢它而不是 DHE,因此连接到这些服务器不会使用或者检查 DHE 参数。如果您确实想检查这些服务器,您可能需要指定密码选择,以便诱导服务器使用 DHE,但不会导致密码选择完全失败。此外,最近的wget 和 curl,特别是使用 2018 年发布的 OpenSSL 1.1.1,将提供 TLS 1.3;如果服务器也支持 1.3,那么密钥交换将有很大不同:显式 FFDHE 参数是绝不但可以使用可选的 RFC7919 标准化组。