2012-11-10 13 views
9

Sto cercando di fare una richiesta userless alle API Foursquare utilizzando Mike Lewis' Python involucro - https://github.com/mLewisLogic/foursquare:pitone Foursquare - certificato SSL3 verifica fallita

client = foursquare.Foursquare(client_id=Client_ID, client_secret=Client_Secret) 
categs = client.venues.categories() 

intermittenza, ho un "Errore di connessione al Ms. Foursquare API ". Esecuzione di un registratore per catturare un messaggio più dettagliato produce:

"routine SSL: SSL3_GET_SERVER_CERTIFICATE: certificato di verifica fallita"

Questo non usavano per accadere e si verifica sia sulla mia macchina di sviluppo di Windows locale e su un server in esecuzione ubuntu. Mi manca qualcosa di base qui sui certificati di sicurezza? Il problema è intermittente e a volte basta lasciarlo un minuto e riprovare risolve il problema temporaneamente.

Ho scaricato la versione 20120716 del wrapper più recente sebbene nel codice per init.py sia ancora detto API_VERSION = '20120608'. Sto usando Python 2.73 e ho anche firmato per la chiave API Foursquare, usando l'id e il segreto nel codice sopra. Ho elencato gli URL, usando il mio IP locale: 8000 e ho provato a usare chiavi separate per le macchine locale e dev, ma questo sembra non fare alcuna differenza.

Aiuto molto apprezzato. Grazie.

risposta

23

Ho riscontrato lo stesso identico problema di ieri. Ho cercato molto e ho provato molto, e sembra che la seguente strategia funzioni per il mio caso (non sono sicuro al 100% ma non riporta più l'errore).

1) Scarica http://curl.haxx.se/ca/cacert.pem

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

2) Vai al tuo Python httplib2 dir. Il mio è a /usr/local/lib/python2.7/dist-packages/httplib2

cd /usr/local/lib/python2.7/dist-packages/httplib2 

3) Eseguire il backup del certificato corrente

cp cacerts.txt backup_cacerts.txt 

4) e quindi copiare il file scaricato lì e rinominarlo come cacerts.txt

mv cacert.pem cacerts.txt 

Questo è tutto.

Spero che aiuti. Se non si ripristina dal file di backup e prova altri metodi.

miei script foursquare funzionano bene dopo cambio questo:)

+0

Funziona come un fascino! Grazie – user1814277

+1

Questa soluzione funziona anche per il pacchetto 'requests' sostituendo il file site packages/requests/cacert.pem. – ShinNoNoir

+1

E funziona anche con boto in 'site-packages/boto/cacerts/cacerts.txt' – ogrisel

0

installare o aggiornare il pacchetto certifi:

pip install --upgrade certifi 

Questa è la soluzione consigliata da urllib3 (che viene utilizzato da molti progetti tra cui requests , che a sua volta è utilizzato dalla libreria foursquare linkata sopra e molte altre librerie): http://urllib3.readthedocs.io/en/latest/user-guide.html#certificate-verification

Se è necessario utilizzare questo per un pacchetto che non usa urllib3, ma per esempio httplib2, copia il file certifi/cacerts.pem nello httplib2/cacerts.txt.Le directory per copiare da/a si possono trovare facendo:

python -c 'import httplib2; import os.path; print(os.path.dirname(httplib2.__file__))' 

python -c 'import certifi; import os.path; print(os.path.dirname(certifi.__file__))' 

Se sono solo utilizzando urllib2, quindi la directory httplib2/ non viene utilizzato, ma una posizione di sistema. È possibile controllare i file che si stanno osservando come segue:

strace python -c "import urllib2; urllib2.urlopen(urllib2.Request('https://google.com/'))" 2>&1 | grep 'open' | grep 'cert'