2017-01-02 37 views
16

Używam lokalnie punktu końcowego google pod numerem dev_appserver.py. Używam eksploratora interfejsu API do testowania aplikacji.Nieprawidłowy i/lub brakujący certyfikat SSL dla adresu URL podczas wywoływania apiclient.discovery.build

Kod używam stworzyć usługę, więc mogę zadzwonić API jest następujący:

from apiclient.discovery import build 
from oauth2client.client import GoogleCredentials 
credentials = GoogleCredentials.get_application_default() 
service = build('speech', 'v1beta1', credentials=credentials) 

Otrzymuję błąd SSL (nieprawidłowy i/lub brak certyfikatu SSL), nawet gdy Uzyskuję dostęp do podanego adresu URL za pomocą przeglądarki, działa dobrze (to znaczy, pojawia się zielona kłódka).

Nie jestem pewien, co się zmieniło, ale to działało dobrze nie tak dawno temu.

Próbowałem wyłączyć sprawdzanie SSL, ale nie mogłem.

Pełne logi poniżej:

INFO  2017-01-02 03:12:02,724 discovery.py:267] URL being requested: GET https://www.googleapis.com/discovery/v1/apis/speech/v1beta1/rest?userIp=0.2.0.3 
ERROR 2017-01-02 03:12:03,022 wsgi.py:263] 
Traceback (most recent call last): 
    File "/home/vini/opt/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle 
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler()) 
    File "/home/vini/opt/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler 
    handler, path, err = LoadObject(self._handler) 
    File "/home/vini/opt/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject 
    obj = __import__(path[0]) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/api.py", line 28, in <module> 
    service = build('speech', 'v1beta1', credentials=credentials) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/lib/oauth2client/_helpers.py", line 133, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/lib/googleapiclient/discovery.py", line 222, in build 
    cache) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/lib/googleapiclient/discovery.py", line 269, in _retrieve_discovery_doc 
    resp, content = http.request(actual_url) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/lib/httplib2/__init__.py", line 1609, in request 
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/lib/httplib2/__init__.py", line 1351, in _request 
    (response, content) = self._conn_request(conn, request_uri, method, body, headers) 
    File "/mnt/b117/home/vini/udacity/cerci-endpoint/lib/httplib2/__init__.py", line 1307, in _conn_request 
    response = conn.getresponse() 
    File "/home/vini/opt/google-cloud-sdk/platform/google_appengine/google/appengine/dist27/gae_override/httplib.py", line 532, in getresponse 
    raise HTTPException(str(e)) 
HTTPException: Invalid and/or missing SSL certificate for URL: https://www.googleapis.com/discovery/v1/apis/speech/v1beta1/rest?userIp=0.2.0.3 

Jakieś pomysły co może być przyczyną tego problemu?

Czy muszę "zainstalować" lub zaktualizować certyfikaty SSL używane przez Pythona?

+1

Samo uzyskanie tego wydania od dzisiaj rano. Może być spowodowane zmianą roku 2016 -> 2017. – allsyed

Odpowiedz

26

Według App Engine issue 13477 wydaje się, że niektóre z certyfikatów znajdujących się w urlfetch_cacerts.txt które jest zawarte w App Engine Python SDK/gcloud-sdk upłynął 2017-01-01.

Jako tymczasowe obejście problemu można zastąpić zawartość <your-cloud-sdk-path>/platform/google_appengine/lib/cacerts/urlfetch_cacerts.txt z https://curl.haxx.se/ca/cacert.pem

+0

Usunięcie wymienionych certyfikatów rzeczywiście rozwiązało problem. Dziękuję bardzo. To doprowadzało mnie do szaleństwa. – diogovk

+0

Świetne @danielx! To działa. Dzięki. Ale jestem zaskoczony, że jeszcze tego nie naprawili – neaGaze

-1

dostał ten błąd na lokalnym środowisku dev niedawno, bo sie 2017. Rozwiązaniem jest aktualizacja wszystkich połączeń UrlFetch i walidacji życie CERT:

urlfetch.fetch(url=url, validate_certificate=True) 

Nie trzeba dotykać certyfikatów gcloud (MacOS). Zobacz Issuing an HTTPS request.

+0

To nie rozwiązało problemu dla mnie. – svpino

0

Aby zbudować na odpowiedzi @danielx dla tych na macOS, to właśnie dla mnie zadziałało. Ścieżka do świadectw dla mnie było:

/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/cacerts/urlfetch_cacerts.txt 

Aby zaktualizować go użyłem następujące kroki:

cd /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/cacerts 
mv urlfetch_cacerts.txt urlfetch_cacerts.bup 
curl -o urlfetch_cacerts.txt -k https://curl.haxx.se/ca/cacert.pem 

Jeśli nie masz curl zainstalowany, można ręcznie download certyfikaty posunięcie do folderu powyżej. Nie zapomnij ponownie uruchomić serwera deweloperów App Engine, jeśli jest już uruchomiony.