2013-01-07 14 views
8

Sto testando un'API che utilizza la funzione curl_exec php e un certificato CA ma qualcosa non funziona e sono un po 'persi.Certificato peer SSL o chiave remota SSH non OK OK

Ho configurato SSL sul mio apache VirtualHost e sembra ok (aprendo https:://[myVHost] ... funziona).

Tuttavia il ricciolo chiamata API ridammi questo messaggio:

  • SSL peer certificate or SSH remote key was not OK

Io non sono molto esperto con SSL quindi ho alcune idee sulla causa di questo.

UPDATE:

Questo è il codice che sto usando nella mia richiesta cURL, ho commentato 2 linee e cambia il loro valore (guarda alla linea 'TODO') e in questo modo si sta lavorando, tuttavia questo è solo un lavoro arround ...

$opts[CURLOPT_URL] = $url; 
    $opts[CURLOPT_RETURNTRANSFER] = true; 
    $opts[CURLOPT_CONNECTTIMEOUT] = 50; 
    $opts[CURLOPT_TIMEOUT] = 100; 
    $headers = array(
     'Accept: application/json', 
     "User-Agent: APIXXX-PHP-Client"); 
    $opts[CURLOPT_HTTPHEADER] = $headers; 
    $opts[CURLOPT_USERPWD] = $env->getApiKey() . ':'; 
    if (certificatePresent()) { 

     // $opts[CURLOPT_SSL_VERIFYPEER] = true; 
     // $opts[CURLOPT_SSL_VERIFYHOST] = 2; 

     // TODO: SET IT BACK 
     $opts[CURLOPT_SSL_VERIFYPEER] = 0; 
     $opts[CURLOPT_SSL_VERIFYHOST] = 0; 

     $opts[CURLOPT_CAINFO] = $path 

     } 

    curl_setopt_array($curl, $opts); 

    $response = curl_exec($curl); 
+0

Abbiamo bisogno del codice completo e completo che stai utilizzando per effettuare la richiesta, incluso * tutto * delle opzioni di arricciatura impostate. Inoltre, questo è un certificato autofirmato? – Charles

+0

Informazioni aggiunte :) sulla domanda 'Certificato autofirmato' Non so: il certificato è fornito con l'API ... – WonderLand

+5

Hai identificato correttamente la causa principale:' CURLOPT_SSL_VERIFYHOST' è 2. Se impostato su 2 , arricciatura verificherà che il certificato sia valido e che sia stato emesso da una CA di cui si fida. Se il certificato remoto è autofirmato o non emesso da una CA che si fida, si lamenterà e darà un errore come quello che ti è stato dato. Se hai ricevuto il certificato da una terza parte, devi convincere la curl a fidarsi della CA che l'ha firmata. Dici che ti è stato dato un certificato CA, giusto? Che cosa hai fatto con esso? – Charles

risposta

4

probabilmente si sta utilizzando certifiacate SSL self-signed, che non passerà quando le opzioni CURLOPT_SSL_VERIFYPEER è impostato.

ci sono due soluzioni:

  1. Acquista valido certificato SSL.
  2. Disattiva la verifica SSL in Curl. (add --insecure option)

Se si disabilita la verifica, non si è certi se si sta veramente comunicando con il proprio host. Quindi dipende dal livello di sicurezza di cui hai bisogno.

0

Hai ragione a voler abilitare SSL_VERIFYPEER se sei preoccupato per gli attacchi man-in-the-middle.

Il vostro $path è impostato in modo che punti al certificato (o al pacchetto di certificati) fornito dal proprietario dell'API? Questo certificato è leggibile dall'utente del server web? In tal caso, hai verificato che il/i certificato/i è/sono uguale a quando visiti manualmente l'indirizzo https in un browser e ispezioni il certificato?

Se non riesci a farlo funzionare e l'API a cui ci si connette ha un certificato SSL che funziona nel normale browser senza avvisi, dovresti essere in grado di impostare $path sul tuo root root CA sul server.

0

È possibile creare un certificato SSL valido e assicurarsi che sia archiviato nella cartella attendibile.

È possibile creare un certificato SSL valido includendo il seguente comando nel prompt dei comandi dello sviluppatore di VS2012. (Questo può essere ottenuto digitando lo sviluppatore all'inizio)

Il seguente comando crea un certificato autofirmato che può essere utilizzato per testare un'applicazione Web che utilizza Secure Sockets Layer (SSL) su un server Web il cui URL è www.example.com . L'OID definito dall'opzione -eku identifica tale certificato come SSL server certificate. Il certificato è archiviato nel mio negozio ed è disponibile a livello macchina (piuttosto che utente).La chiave privata del certificato è esportabile e il certificato è valido da May 10, 2010 through December 22, 2011.

Makecert -r -pe -n CN = "www.example.com" -b 05/10/2010 -e 12/22/2011 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr LocalMachine scambio-Sky -sp "Microsoft RSA SChannel Cryptographic Provider" -Sy 12

per ulteriori informazioni su come creare il SSL certificate

Ora assicurarsi che il presente certificato è attendibile, questo può essere fatto digitando CERTMGR nel cmd ..

ora il certificato creato è nella cartella PERSONAL. copialo e incollalo nella FOLDER DI PERSONE FIDATE.

Questo dovrebbe fare il trucco. Fammi sapere se questo non funziona.

2

Anche se io rispondo un vecchio post, penso che sarà aiutare il nuovo viewers-

È possibile controllare il problema aggiungendo

$opts[CURLOPT_VERBOSE] = 1 

Per il certificato autofirmato, il client può connettersi al server utilizzando l'indirizzo IP, poiché il nome host non è disponibile nella cache DNS. In tal caso, il NOME COMMON (CN) del certificato del server deve corrispondere con l'IP del server (inserire l'indirizzo IP come nome comune durante la generazione del certificato del server). Quando si esegue correttamente, si può vedere questo messaggio:

nome comune: 192.168.0.1 (abbinato)

Qui 192.168.0.1 è un esempio.

0

Accanto CURLOPT_SSL_VERIFYPEER ci sono altre due impostazioni che possono essere modificate per false/0:

CURLOPT_SSL_VERIFYHOST 
CURLOPT_SSL_VERIFYSTATUS 

fate attenzione che si dovrebbe risolvere i certificati SSL & impostazioni invece di disabilitazione sicurezza!

Problemi correlati