Jak naprawić błąd SSL "dh key too small" w PHP (SoapClient i cURL)

Błąd SoapClient::__doRequest(): SSL operation failed with code 1 ... dh key too small pojawia się, gdy serwer, z którym łączy się PHP, używa zbyt słabego klucza Diffie-Hellmana. Pokazujemy, jak go obejść w OpenSSL, cURL i SoapClient.

Jak naprawić błąd SSL "dh key too small" w PHP (SoapClient i cURL)

W SKRÓCIE

  • Błąd "dh key too small" oznacza, że serwer używa klucza DH słabszego, niż dopuszcza domyślny poziom bezpieczeństwa OpenSSL.
  • Można obniżyć poziom bezpieczeństwa (SECLEVEL) globalnie w OpenSSL albo tylko dla jednego połączenia.
  • Dla cURL służy opcja CURLOPT_SSL_CIPHER_LIST, dla SoapClient - kontekst strumienia z opcją ciphers.
  • Najlepszym rozwiązaniem jest poproszenie administratora serwera o klucz DH co najmniej 2048-bitowy.

Podczas pracy z PHP, szczególnie przy korzystaniu z cURL lub SOAP, możesz trafić na błąd:

SoapClient::__doRequest(): SSL operation failed with code 1. OpenSSL Error messages: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small

Oznacza on, że serwer docelowy proponuje klucz Diffie-Hellmana krótszy, niż pozwala domyślny poziom bezpieczeństwa OpenSSL na Twoim serwerze. Poniżej trzy sposoby rozwiązania problemu.

Krok 1: Ustawienie w konfiguracji OpenSSL

Otwórz plik konfiguracyjny OpenSSL, zwykle /etc/ssl/openssl.cnf, i zmień wartość parametru CipherString na DEFAULT:@SECLEVEL=1. Ta zmiana działa globalnie dla wszystkich połączeń na serwerze.

/etc/ssl/openssl.cnfini
CipherString = DEFAULT:@SECLEVEL=1

Krok 2: PHP i cURL

Jeśli korzystasz z cURL, ustaw listę szyfrów tylko dla danego połączenia - bez zmiany konfiguracji całego serwera.

cURLphp
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT:@SECLEVEL=1');
// pozostałe opcje cURL...
$response = curl_exec($ch);

Krok 3: PHP i SOAP

Dla SOAP przygotuj kontekst strumienia (stream context) z listą szyfrów i przekaż go do klienta SoapClient.

SoapClientphp
$streamContext = stream_context_create([
 'ssl' => [
 'ciphers' => 'DEFAULT:@SECLEVEL=1',
 ],
]);

$client = new SoapClient(null, [
 'location' => $url,
 'uri' => $url,
 'stream_context' => $streamContext,
]);

Uwaga na bezpieczeństwo

Obniżenie SECLEVEL osłabia ochronę połączenia. Stosuj je tylko dla konkretnego połączenia i poproś administratora serwera docelowego o klucz DH co najmniej 2048-bitowy - wtedy obejście nie będzie potrzebne.

Podsumowanie

Po zastosowaniu powyższych kroków błąd związany z kluczem SSL powinien zniknąć. Śledź zmiany w konfiguracji serwerów, z którymi się łączysz, i korzystaj z aktualnych wersji bibliotek - to podstawa bezpieczeństwa aplikacji.

Potrzebujesz wsparcia przy integracji?

Pomożemy z integracjami SOAP i REST, aktualizacją serwerów i utrzymaniem aplikacji.