Curl: problema con il certificato SSL, verificare che il certificato CA sia OK
07 aprile 2006
Quando apri un URL sicuro con Curl potresti ricevere il seguente errore:
Problema del certificato SSL, verificare che il certificato CA sia OK
Spiegherò perché l'errore e cosa dovresti fare al riguardo.
Il modo più semplice per eliminare l'errore sarebbe aggiungere le seguenti due righe al tuo script. Questa soluzione rappresenta un rischio per la sicurezza.
//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
Vediamo cosa fanno questi due parametri. Citando il manuale.
CURLOPT_SSL_VERIFYHOST : 1 per verificare l'esistenza di un nome comune nel certificato peer SSL. 2 per verificare l'esistenza di un nome comune e anche verificare che corrisponda al nome host fornito.
CURLOPT_SSL_VERIFYPEER : FALSE per impedire a CURL di verificare il certificato del peer. È possibile specificare certificati alternativi per la verifica con l'opzione CURLOPT_CAINFO oppure è possibile specificare una directory di certificati con l'opzione CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST potrebbe anche essere TRUE o FALSE se CURLOPT_SSL_VERIFYPEER è disabilitato (il valore predefinito è 2). L'impostazione di CURLOPT_SSL_VERIFYHOST su 2 (questo è il valore predefinito) garantirà che il certificato che ti viene presentato ha un "nome comune" corrispondente all'URN che stai utilizzando per accedere alla risorsa remota. Questo è un controllo salutare ma non garantisce che il tuo programma non venga ingannato.
Inserisci "l'uomo al centro"
Il tuo programma potrebbe essere fuorviante nel parlare invece con un altro server. Ciò può essere ottenuto attraverso diversi meccanismi, come l'avvelenamento da dns o arp (Questa è una storia per un altro giorno). L'intruso può anche autofirmare un certificato con lo stesso "nome comune" previsto dal programma. La comunicazione sarebbe ancora crittografata, ma porteresti i tuoi segreti a un impostore. Questo tipo di attacco si chiama "uomo in mezzo"
Sconfiggendo "l'uomo nel mezzo"
Bene, dobbiamo verificare che il certificato che ci viene presentato sia reale. Lo facciamo confrontandolo con un certificato di cui * fidiamo ragionevolmente.
Se la risorsa remota è protetta da un certificato emesso da una delle principali CA come Verisign, GeoTrust et al, è possibile confrontare in modo sicuro con il bundle di certificati CA di Mozilla che è possibile ottenere da
http://curl.haxx.se/docs/caextract .html
Salvare il file cacert.pem
da qualche parte nel server e impostare le seguenti opzioni nello script.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");