Fehlermeldung
[SSL: DH_KEY_TOO_SMALL] dh key too small
Danach folgt eine Quellcode-Position wie „(_ssl.c:1082)“. curl und andere OpenSSL-Clients geben denselben Grund als „dh key too small“ aus.
Python ssl module (OpenSSL, security level 2) — ssl.SSLError, SSL_R_DH_KEY_TOO_SMALL
Was der Fehler bedeutet
Der Server hat einen Diffie-Hellman-Schlüsselaustausch über endlichen Körpern (DHE) mit einer Gruppe gewählt, die kleiner ist, als der Client akzeptiert, typischerweise 1024 Bit. Python 3.10 und neuer verwenden OpenSSL-Sicherheitsniveau 2, das mindestens 2048-Bit-DH verlangt, deshalb bricht der Client den Handshake ab. Das Zertifikat des Servers ist nicht das Problem.
Warum der Fehler auftritt
Der Server verwendet eine 1024-Bit-DH-Gruppe
häufigAlte Releases von Apache httpd (vor 2.4.7 verwendeten sie feste 1024-Bit-Parameter), ältere Java-basierte Server und Konfigurationen, die noch eine vor Jahren erzeugte dhparam-Datei laden. Die Logjam-Untersuchung (2015) hat gezeigt, dass 1024-Bit-DH in Reichweite gut finanzierter Angreifer liegt.
Das strengere Standard-Sicherheitsniveau von Python
häufigPython 3.10 hat seinen Standard auf OpenSSL-Sicherheitsniveau 2 angehoben. Code, der sich unter Python 3.9 problemlos verbunden hat, kann nach einem Upgrade scheitern, obwohl sich am Server nichts geändert hat.
Eingebettete Geräte und Appliances
gelegentlichVerwaltungsoberflächen von Druckern, Telefonanlagen und Industriegeräten bieten oft nur DHE mit kleinen Gruppen an.
So behebst du den Fehler
- 1.
Größe des Schlüsselaustauschs bestätigen
Verbinde dich einmal mit openssl s_client auf Sicherheitsniveau 1 und lies „Server Temp Key“ ab.
bash # "Server Temp Key: DH, 1024 bits" confirms the weak group openssl s_client -connect legacy.example.com:443 -servername legacy.example.com \ -cipher 'DEFAULT:@SECLEVEL=1' </dev/null 2>/dev/null | grep 'Server Temp Key' - 2.
Eigener Server: ECDHE oder eine 2048-Bit-Gruppe verwenden
Bevorzuge ECDHE-Suites (und TLS 1.3); wenn DHE nötig ist, konfiguriere eine Gruppe aus RFC 7919 mit mindestens 2048 Bit.
text # nginx: prefer ECDHE; if DHE must stay, use a 2048-bit (or larger) group ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_dhparam /etc/nginx/ffdhe2048.pem; # RFC 7919 group - 3.
Übergangslösung: Sicherheitsniveau für einen Host senken
„DEFAULT:@SECLEVEL=1“ in einem eigenen Kontext akzeptiert 1024-Bit-DH nur für diesen Host. Verwende es nicht in gemeinsam genutzten Kontexten oder im Standardkontext: Es akzeptiert auch andere schwache Parameter.
python # Temporary workaround for one legacy host: security level 1 accepts 1024-bit DH import ssl, urllib.request ctx = ssl.create_default_context() ctx.set_ciphers("DEFAULT:@SECLEVEL=1") urllib.request.urlopen("https://legacy.example.com/", context=ctx)
Verwandte Fehler
[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] ssl/tls alert handshake failurePython ssl module (OpenSSL)[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabledPython ssl module (OpenSSL 3)curl: (35) TLS connect error: error:0A000410:SSL routines::ssl/tls alert handsh…curl (OpenSSL backend)