PHP: risolvere il problema "dh key too small"

Sviluppando un'applicazione PHP mi sono ritrovato a dover scaricare un file csv da un portale esterno; tutto molto semplice, una chiamata tramite curl() e funziona tutto...
In locale sì...ma nel server di produzione no!

La sezione di codice utilizzata è molto semplice:


$_source_url = 'https://www.site.com/file.csv';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_source_url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$data = curl_exec($ch);
curl_close($ch);

Ricevendo una risposta vuota ho quindi scritto qualche riga per testare il tutto:


echo 'Test CURL';
$_source_url = 'https://www.site.com/file.csv';
echo 'Sorgente: ' . $_source_url . '';

try {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $_source_url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);

    $data = curl_exec($ch);
    if (curl_error($ch)) {
        $error_msg = curl_error($ch);
        echo 'curl_error';
        echo $error_msg . '';
        exit;
    }
    curl_close($ch);
} catch (\Throwable $th) {
    echo $th->getCode() . '';
    echo $th->getMessage() . '';
    exit;
}

echo 'Tutto ok!';

Mi sono quindi ritrovato con l'errore "dh key too small".
In parole povere l'errore indica che il server sta utilizzando una chiave per le comunicazioni SSL più corta del necessario, ovvero troppo "debole".
Non potendo intervenire sul server, come nel mio caso, è possibile impostare un'opzione aggiuntiva per curl, ovvero questa:

curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT@SECLEVEL=1');

E il codice completo e funzionante sarà quindi il seguente:


$_source_url = 'https://www.site.com/file.csv';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_source_url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT@SECLEVEL=1');
$data = curl_exec($ch);
curl_close($ch);

Condividi questo post


Commenti