convalida cURL cert con curlopt_cainfo non funzionante

1

Voglio convalidare il mio certificato SSL ogni volta che eseguo chiamate API. Ho seguito questa guida:

link

Questo è il mio codice:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://api-3t.sandbox.paypal.com/nvp");
curl_setopt($ch, CURLOPT_POSTFIELDS, ($apiCredentials . $nvpStr));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Returnerar resultatet istället för att skriva ut det

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, curlopt_cainfo, (dirname(__FILE__) . '/cacert.pem'));

$response = curl_exec($ch);

Il problema è che il mio certificato SSL non è stato convalidato affatto - sembra che il file cacert.pem non sia nemmeno controllato! Ho cambiato il nome del file, l'ho eliminato e ho persino provato a modificarlo rimuovendo tutti i certificati nel file cacert.pem che provengono dall'emittente del certificato. La chiamata API è ancora in esecuzione, non importa cosa!

Quale potrebbe essere il problema?

    
posta Marcus Edensky 10.06.2014 - 04:21
fonte

1 risposta

2

Semplice: -)

Prima di tutto ho degli strani errori quando eseguo il tuo script:

PHP Notice:  Use of undefined constant curlopt_cainfo - assumed 'curlopt_cainfo' in ...
PHP Warning:  curl_setopt() expects parameter 2 to be long, string given in ...

Così ho sostituito con curlopt_cainfo con CURLOPT_CAINFO - che sembra sbarazzarsi di loro.

Ho aggiunto quanto segue dopo curl_exec() call:

if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

Quando ho perso cacert.pem o il percorso non è valido, ha mostrato:

Curl error: Problem with the SSL CA cert (path? access rights?)

Dopo che ho provato a hackerare il certificato dal sito paypal come questo (fai NOT fai questo in ambiente di produzione):

openssl s_client -connect api-3t.sandbox.paypal.com:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cacert.pem

Si è lamentato di nuovo

Curl error: Peer certificate cannot be authenticated with known CA certificates

Dopo aver fornito correttamente un pacchetto di certificati da mozilla:

wget http://curl.haxx.se/ca/cacert.pem -O cacert.pem 

Funziona bene: -)

Non penso che tu debba fornire l'opzione CURLOPT_CAINFO come arricciamento viene fornito in bundle con cacert.pem da mozilla e questo dovrebbe funzionare fuori dagli schemi con appena CURLOPT_SSL_VERIFYPEER e CURLOPT_SSL_VERIFYHOST abilitati.

    
risposta data 22.08.2014 - 04:03
fonte

Leggi altre domande sui tag