PHP - Errore certificato SSL: impossibile ottenere il certificato emittente locale


189

Sto eseguendo PHP versione 5.6.3 come parte di XAMPP su Windows 7.

Quando provo a utilizzare l'API Mandrill, visualizzo il seguente errore:

Eccezione non rilevata "Mandrill_HttpError" con messaggio "Chiamata API ai messaggi / modello di invio non riuscita: problema certificato SSL: impossibile ottenere il certificato emittente locale"

Ho già provato tutto ciò che ho letto su StackOverflow, incluso l'aggiunta di quanto segue al file php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

E naturalmente scaricato in quella posizione il file cacert.pem da http://curl.haxx.se/docs/caextract.html

ma dopo tutto ciò, riavviato XAMPP e il server Apache ma continua a ricevere lo stesso errore.

Non so davvero cos'altro provare.

Qualcuno può consigliare su cos'altro posso provare?



3
Assicurati anche di aver decommentato quella linea rimuovendo il carattere ';' iniziale. dovrebbe essere curl.cainfo = "C: \ xampp \ php \ cacert.pem" anziché; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan,

L'uso di HTTPS su HTTP causerebbe anche questo errore?
javiniar.leonard,

Risposte:


366

Finalmente questo ha funzionato!

  1. Scarica il pacchetto di certificati .

  2. Mettilo da qualche parte. Nel mio caso, quella era la c:\wamp\directory (se stai usando Wamp 64 bit, allora lo è c:\wamp64\).

  3. Abilita mod_sslin Apache e php_openssl.dllin php.ini(decommentali rimuovendoli ;all'inizio). Ma fai attenzione, il mio problema era che avevo due php.inifile e ho bisogno di farlo in entrambi. Uno è quello che ottieni dall'icona della barra delle applicazioni WAMP e un altro, nel mio caso, è inC:\wamp\bin\php\php5.5.12\

  4. Aggiungi queste righe al tuo certificato in entrambi i php.inifile:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. Riavvia i servizi Wamp.


3
Nel mio caso quella era la directory c: \ xamp \ e le sue finestre 7 e questa soluzione funziona perfettamente ... grazie mille ...
Manu RS

1
Il pacchetto di certificati più recente può essere scaricato dal sito di arricciatura originale curl.haxx.se/docs/caextract.html
Paul

1
Nel mio caso la linea aveva ;all'inizio e mi ci sono volute ore per capire che significa che è un commento. quindi per i rumori come me, è necessario rimuovere ;anche quello
abhyudayasrinet,

1
@SurajNeupane non sono sicuro, ho passato molto tempo a recuperarlo allora, uso macchine virtuali, come Homestead e non devo occuparmene. Questo era un caso specifico
Mladen Janjetovic, il

2
Questa è la chiaveBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

Dichiarazione di non responsabilità: questo codice rende il server insicuro.

Ho avuto lo stesso problema nel file Mandrill.php dopo la riga numero 65 dove dice $ this-> ch = curl_init ();

Aggiungi le seguenti due righe:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

Ciò ha risolto il mio problema e ha anche inviato e-mail utilizzando localhost ma suggerisco di NON utilizzarlo nella versione live live. Sul tuo server live il codice dovrebbe funzionare senza questo codice.


1
qualcosa che posso provare a far funzionare l'ambiente dei miei sviluppatori senza questo bypass?
Dor Dadush,

4
per me, con il solo fatto CURLOPT_SSL_VERIFYPEERdi falselavorare.
Francisco Corrales Morales,

29
Mentre sei tecnicamente corretto, disabilitare SSL è una cattiva idea. Anche su localhost, è meglio caricare correttamente i certificati come indicato nell'altra risposta.
Spinal,

Mentre sei tecnicamente corretto, disabilitare SSL è una cattiva idea. Anche se è veemente resistente a lavorare in qualsiasi altro modo, meglio perdere il lavoro che fare le cose nel modo non corretto di amministratore di sistema. @Spinal

45

Grazie @Mladen Janjetovic,

Il tuo suggerimento ha funzionato per me su Mac con ampps installato.

Copiato: http://curl.haxx.se/ca/cacert.pem

Per: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

E aggiornato php.inicon quel percorso e riavviato Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

E ha applicato la stessa impostazione nell'installazione di Windows AMPPS e ha funzionato perfettamente anche in esso.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: Lo stesso vale per Wamp.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Se stai cercando di generare un nuovo certificato SSL utilizzando SAN per localhost, i passaggi su questo post hanno funzionato per me Centos 7 / Vagrant / Chrome Browser.


18

Quando visualizzi la pagina http://curl.haxx.se/docs/caextract.html , noterai a grandi lettere una sezione chiamata:

RSA-1024 rimosso

Leggilo, quindi scarica la versione dei certificati che include i certificati "RSA-1024". https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Funzioneranno con Mandrill.

Disabilitare SSL è una cattiva idea.


1
Ciò ha risolto un problema con AWS / Guzzle / cURL con cui ho lottato tutto il giorno. Grazie!
voidstate

@voidstate So che questo è vecchio ma puoi anche bypassarlo in guzzle usando questo ['verifica' => falso], per il documento completo su ssl / curl / guzzle vai qui guzzle.readthedocs.org/en/latest/…
Giovanni,

@John, ma ciò sarebbe dissimulare la verifica SSL che non è quello che vuoi fare, quindi non suggerirei di farlo.
Arturo Alvarado,

1
Per Windows, dovrai salvare i file sul tuo server (es. In C: \ curl \ curl-ca-bundle.crt), quindi aggiungi quanto segue al tuo php.ini: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

Ho avuto questo dopo che ha funzionato perfettamente per anni (anche sopravvissuto a una modifica del server) ma ho problemi a capire esattamente cosa sta succedendo qui. È che il ricciolo o openssl è stato aggiornato e lo ha fatto cambiare in un pacchetto incompatibile con mailchimp?
Sammaye,

11

I passaggi precedenti, sebbene utili, non hanno funzionato per me su Windows 8. Non conosco la correlazione, ma i passaggi seguenti hanno funzionato. Fondamentalmente una modifica nel file cacert.pem. Spero che questo aiuti qualcuno.

  • Scarica il file cacert.pem da qui: http://curl.haxx.se/docs/caextract.html
  • Salva il file nella cartella di installazione di PHP. (es: se si utilizza xampp - salvarlo in c: \ Installation_Dir \ xampp \ php \ cacert.pem).
  • Apri il tuo file php.ini e aggiungi queste righe:
  • curl.cainfo = "C: \ Installation_Dir \ xampp \ php \ cacert.pem" openssl.cafile = "C: \ Installation_Dir \ xampp \ php \ cacert.pem"
  • Riavvia il tuo server Apache e questo dovrebbe risolverlo (basta arrestare e avviare i servizi secondo necessità).

11

Ho trovato una nuova soluzione senza alcuna certificazione richiesta per chiamare curl solo aggiungere due righe di codice.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
Anche se questo può funzionare, questo non è affatto raccomandato. In pratica stai dicendo, fidati di tutti i certificati ... e apre anche la tua applicazione per possibili attacchi se dimentichi e il tuo codice lo rende in produzione con questa modifica ... non è davvero molto lavoro scaricare il bundle CA e aggiungi punto PHP ad esso.
user919426

questo è il concetto di ricciolo, quindi ogni volta che usi ricciolo aggiungi il codice sopra
Manish sharma

8

Se non hai accesso a php.ini , l'aggiunta di questo codice (dopo la $ch = curl_init();riga) funziona per me:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

Quindi, dovrai solo scaricare ca-bundle.crt e salvarlo nella posizione specificata $certificate_location.


3

Ho una soluzione molto semplice di questo problema. Puoi farlo senza alcun file di certificato.

Vai su Laravel Root Folder -> Vender -> guzzlehttp -> guzzle -> src

apri Client.php

trova $ defaults Array. che assomiglia in questo modo ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Ora il lavoro principale è cambiare il valore della chiave di verifica .

'verify'          => false,

Quindi dopo questo non controllerà il certificato SSL per la richiesta CURL ... Questa soluzione funziona per me. Trovo questa soluzione dopo molte ricerche ...


2

elaborando le risposte di cui sopra per la distribuzione del server.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

dovrebbe fare il trucco per l'ambiente di sviluppo senza compromettere il server quando distribuito.


L'esecuzione di diverse parti del codice in diversi ambienti non sembra un buon concetto - rende più difficile il debug
Nico Haase

2

Ho provato questo funziona

Aperto

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

e cambia questo

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

a questa

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

Ho avuto lo stesso problema durante la creazione della mia app in AppVeyor.

  • Scarica https://curl.haxx.se/ca/cacert.pem suc:\php
  • Abilita openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Trova il certificatoecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

Se nessuna delle soluzioni precedenti funziona correttamente, prova ad aggiornare l'installazione di XAMPP a una versione più recente.

Stavo eseguendo XAMPP con php 5.5.11, lo stesso codice esatto non funzionava, ho aggiornato a XAMPP con php 5.6.28 e le soluzioni sopra funzionavano.

Inoltre, l'aggiornamento di PHP non ha funzionato e sembra una combinazione di impostazioni apache e php su quella versione di XAMPP.

Spero che aiuti qualcuno.


0

Ho ricevuto l'errore come:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Sto usando Windows Machine. Quindi ho seguito i passaggi seguenti.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

Spero che possa aiutare qualcuno


0

Stavo affrontando un problema come questo nel mio sistema locale ma non nel server live. Ho anche menzionato un'altra soluzione in questa pagina prima, ma che non funzionava in localhost. Quindi trovare una nuova soluzione di questo, che sta funzionando nel server localhost-WAMP .

Errore cURL: problema certificato SSL: impossibile ottenere il certificato emittente locale

a volte il sistema non riesce a trovare cacert.pem nell'unità. così puoi definirlo nel tuo codice dove intendi usare CURL

Si noti che sto soddisfando tutte le condizioni per questo come la libreria OPEN-SSL attiva e altre cose.

controlla questo codice di CURL .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

ma questa soluzione potrebbe non funzionare nel server live. a causa del percorso assoluto di cacert.pem


0

Ho una soluzione adeguata di questo problema, cerchiamo di capire la causa principale di questo problema. Questo problema si verifica quando i server remoti ssl non possono essere verificati utilizzando i certificati radice nell'archivio certificati del sistema o se ssl remoto non è installato insieme ai certificati a catena. Se hai un sistema linux con accesso root ssh, allora in questo caso puoi provare ad aggiornare il tuo archivio certificati con il comando seguente:

update-ca-certificates

Se il problema persiste, è necessario aggiungere il certificato root e provvisorio del server remoto nel proprio archivio certificati. Puoi scaricare certificati root e intermedi e aggiungerli nella directory / usr / local / share / ca-certificati e quindi eseguire il comando update-ca-certificates. Questo dovrebbe fare il trucco. Allo stesso modo per Windows puoi cercare come aggiungere root e certificato intermedio.

L'altro modo per risolvere questo problema è chiedere al team del server remoto di aggiungere il certificato ssl come un pacchetto di certificati root di dominio, certificati intermedi e certificati root.


-4

per guzzle puoi provare questo:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

testato su guzzle / guzzle 3. *


1
c'è un punto nel rispondere a una domanda di 3 anni che ha una risposta accettata con oltre 200 voti?
Trey

la mia risposta è più semplice di quelle sopra, vedrai che riceverò 10 voti per alcuni mesi ...
fico7489

1
Ne dubito fortemente, non vedendo alcuna menzione di guzzle in OP ... quindi è una risposta indipendente. È lo stesso quando qualcuno fornisce una soluzione jQuery per un problema JavaScript. È irrilevante.
Trey

ciò non cambia il fatto che non viene utilizzato qui. Consiglieresti una soluzione Linux a un utente Windows perché è il sistema operativo server più utilizzato? Non tutti vogliono usare Guzzle, personalmente non l'ho mai usato una volta durante i miei anni di utilizzo di PHP. Per me, una richiesta HTTP non è davvero così difficile avere bisogno di un pacchetto per questo.
Trey

1
pienamente consapevole - non è solo necessario .. basta leggere i documenti per il ricciolo ed è tutto autoesplicativo. Non si tratta di essere più intelligenti ... si tratta di rispondere correttamente alla domanda
treyBake
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.