2012-09-06 27 views
13

Uso cURL per verificare le transazioni PayPal in un plug-in WordPress. Recentemente ho iniziato a ricevere segnalazioni di bug su utente che non è in grado di completare il processo di acquisto perché la transazione non può essere verificata. Ho rintracciato l'errore:L'utilizzo di CURLOPT_CAINFO con il gruppo di CA aggiornato causa la verifica del certificato non riuscita

SSL certificate problem, verify that the CA cert is OK. Details: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

ho trovato un sacco di domande qui in StackOverflow relative allo stesso problema, la maggior parte di loro ha detto che la soluzione era quello di fornire un fascio di CA utilizzando l'opzione CURLOPT_CAINFO di cURL. Ho scaricato e attualmente spedisco con il plug-in la versione più recente (convertita il 28 giugno 2012) di http://curl.haxx.se/ca/cacert.pem. Questo ha risolto la maggior parte dei problemi che avevo ricevuto.

Il problema ora è che ho appena ricevuto un altro rapporto sui pagamenti non riusciti e l'errore era lo stesso: SSL certificate problem, verify that the CA cert is OK.. La parte interessante è che ora la soluzione era rimuovere l'opzione . Mi chiedo se ci sia una spiegazione per questo. Pensavo che l'utilizzo di un pacchetto di CA aggiornato, come quello scaricato, fosse una soluzione generale, ma sembra essere altrimenti.

Quale sarebbe una soluzione generale per questo tipo di problema? e cosa potrebbe spiegare che l'utilizzo del pacchetto CA aggiornato causa problemi con i certificati SSL, invece di risolverli ?.

Questa è la configuartion cURL:

<?php 
    $ch = curl_init("https://www.paypal.com/cgi-bin/webscr"); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_VERBOSE, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $content); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($ch); 
?> 

UPDATE: Il certificato per www.paypal.com è firmato da VeriSign. La Gerarchia Certificate (come mostrato in Firefox) è:

  • VeriSign classe 3 Public Certification Authority primario - G5
  • VeriSign Classe 3 Extended Validation SSL CA
  • www.paypal.com

Posso confermare il certificato per l'Autorità di certificazione primaria pubblica di Classe 3 VeriSign - G5 è incluso nella versione che utilizzo di http://curl.haxx.se/ca/cacert.pem.

Grazie per il vostro aiuto.

+0

(Hai ancora questo problema?) Solo per restringere la richiesta: ti connetti a PayPal dallo stesso host per ogni richiesta? Significato, lo stesso codice sorgente, dalla stessa macchina, occasionalmente genera questo errore? –

+0

Ci scusiamo per la risposta in ritardo. Il codice sopra fa parte di un plugin per WordPress. Stavo vedendo risultati diversi con lo stesso codice sorgente, ma con macchine diverse. Alcuni utenti hanno segnalato problemi durante l'utilizzo del pacchetto di certificati personalizzati e altri hanno segnalato problemi durante l'utilizzo del pacchetto predefinito. La mia soluzione era di supportare entrambi gli scenari: provare con il pacchetto personalizzato e ripetere la richiesta senza di esso, in caso di errore. –

+0

Problema interessante. La soluzione che descrivi sembra la tua migliore scommessa. Senza tracciare la versione php + curl di ogni utente sarebbe difficile isolarne la causa: è un problema di permessi, un'API legacy, un bug storico di php/curl, un host configurato male? Troppi fattori Basti pensare che preferire un bundle CA personalizzato aggiornato è una buona pratica e dovrebbe essere affidabile per ambienti php moderni ben configurati. –

risposta

3

vedono questo url

http://davidwalsh.name/php-ssl-curl-error

o provare

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,'https://thirdparty.com/token.php'); //not the actual site 
curl_setopt($ch,CURLOPT_TIMEOUT,60); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,'customer_id='.$cid.'&password='.$pass); 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); 
curl_setopt($ch,CURLOPT_CAINFO,'mozilla.pem'); /* fixed! */ 
$result = curl_exec($ch); 
if(empty($result)) { /* error: nothing returned */ } else { /* success! */ } 
curl_close($ch); 
+2

Tx @AbidHussain, credo che mozzila.pem sia lo stesso file che sto usando con un nome diverso. L'utilizzo di questo pacchetto ha risolto il problema nella maggior parte dei casi che ho visto, ma anche per gli altri utenti. Che è quello che sto cercando di capire ora. –

11

Se si hanno questo problema, per favore, fare non disabilitazione dei pari e la verifica host come qualcuno ha suggerito .

Questo lascerà le comunicazioni aperte a potenziali attacchi man-in-the-middle, vanificando lo scopo dell'utilizzo di SSL in primo luogo.

Una potenziale spiegazione di questo problema è che l'impostazione del proprio CURLOPT_CAINFO (in particolare su un percorso di certificato errato - lo farei doppio-doppio controllo) sovrascrive il percorso predefinito sul server.

Dopo aver rimosso l'impostazione, è tornato al suo valore predefinito (che può essere impostato in PHP).

Un'altra cosa da tenere a mente è che è un percorso assoluto.

+0

Grazie @Tim_K. Sto ancora utilizzando la verifica peer e host. Allora stavo lavorando su un plugin per WordPress e c'erano solo pochi host che mostravano problemi SSL ** dopo ** ho introdotto il pacchetto di certificati personalizzati. Non ho mai capito il motivo; dato che la maggior parte degli altri host stava lavorando. Ho finito per fare le richieste usando il pacchetto di certificati personalizzati e ricominciare a usare quello predefinito (rimuovendo l'impostazione 'CURLOPT_CAINFO') se i problemi si presentavano. –

+0

+1 per il percorso assoluto –

Problemi correlati