Zum Inhalt springen
ecdsa.com
Python ssl module (OpenSSL, security level 2)Python cryptography

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

So behebst du den Fehler

  1. 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. 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. 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

Gesamte Signaturfehler-Datenbank durchsuchen