Python: SSL: сертификат CERTIFICATE_VERIFY_FAILED не удалось проверить: невозможно получить сертификат локального эмитента (_ssl.c: 1051) - PullRequest
0 голосов
/ 27 октября 2019

Я использую приложение, написанное на Python 3.6.8 (для Android), которое возвращает эту ошибку с мобильных телефонов при доступе из urllib.request (Python3) в файл JSON URL-адреса, размещенного на веб-странице.

Это ошибка:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:
unable to get local issuer certificate (_ssl.c: 1051)

Запуск сценария с рабочего стола в Windows (W7) и в Linux (Ubuntu). У меня нет этой ошибки, и я получаю к ней доступ совершенно. Я искал возможные решения онлайн, но пока ничего. Кто-нибудь знает, как это исправить?

Я не понимаю, почему я могу запустить скрипт на Windows и Linux, а не на мобильном телефоне (Android). Нужно ли добавить код в скрипт? Спасибо

main.py

import socket
import ssl
import urllib.request # Para Python3
import urllib.error
from urllib.request import urlopen

class Api(Screen):
    data_json = StringProperty("")
    def data_api(self):
        try:
            url = "https://...../data.json"
            request_json = urllib.request.Request(
                url, 
                data=None, 
                headers={
                    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
                }
            )

            context = ssl.SSLContext()
            response = urllib.request.urlopen(request_json, context=context)

            if response.getcode() == 401:
                print("Acces:", str(response.getcode()))

            if response.getcode() == 403:
                print("Acces:", str(response.getcode()))

            if response.getcode() == 200:
                print("Access:", str(response.getcode()))
                data = json.loads(response.read())
                self.data_json = str(data)
                print(data)

        except (urllib.error.HTTPError) as e:
            print("Error: ", e)
...