получить исключение "SSLError: [SSL: BAD_SIGNATURE] bad signature (_ssl.c: 726)" при выполнении скрипта Python на Android - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть простой скрипт Python, который довольно хорошо работает на Python 2.7 в Windows 10.

, однако он выдает ошибку

"SSLError: [SSL: BAD_SIGNATURE] bad signature (_ssl.c:726)" 

при запуске из Android.

код довольно прост, как показано ниже:

import urllib
import urllib2
import ssl
import traceback

#ssl._https_verify_certificates(False)
#ssl._create_default_https_context = ssl._create_unverified_context

try:

    url="https://stackoverflow.com/"
    https_context = ssl._create_unverified_context(cert_reqs=ssl.CERT_NONE,check_hostname=False)
    https_handler = urllib2.HTTPSHandler(context=https_context)
    opener = urllib2.build_opener(https_handler)
    rep=opener.open(url)
    print(rep.read())
except Exception, e:
    urllib.urlopen("http://c.seechentech.com/exception?code=484&error=%s&u=%s" % (traceback.format_exc(), url))

После некоторого расследования я обнаружил, что это исключение возникает при рукопожатии сокета, но я уже установил проверку сертификата на False (естьмне не нужно проверять сертификат), почему он проверяет подпись?Как решить эту проблему?

1 Ответ

0 голосов
/ 08 октября 2018

эта проблема была решена, и я хотел бы поделиться своими выводами.

Нахождение 1: Независимо от того, установлен ли сертификат для проверки или нет, OpenSSL-сокет, который вызывается Python Socket,всегда будет выполнять рукопожатие SSL, когда требуется сертификат PEM.Этот вывод объясняет, почему мой код дает сбой во время рукопожатия сокета.

Нахождение 2: Python может загрузить доверенный ЦС системы из расположения по умолчанию Windows 10, однако на Android происходит сбой.Это может быть вызвано двумя потенциальными причинами:

1) Python не может найти местоположение CA по умолчанию на Andorid, которое является / system / etc / security / cacerts /

2) Python ожидает, что CA будетФормат PEM, но доверенный CA Android имеет дополнительные строки после --- END CERTIFICAT ---, что является признаком окончания содержимого CA.

Я не проверял, какая причина фактически привела к сбою загрузки сертификата CA.То, что я сделал для получения правильных данных CA Python, объединил все файлы CA, которые я извлек из одного устройства Android, в один файл и установил ssl.SSLContext с помощью метода load_verify_locations.

Finding 3: На Android отсутствуют некоторые доверенные CA по сравнению с доверенными CA в Windows, поэтому мне нужно вручную добавить их в мой объединенный файл CA.

Нахождение 4: Документ Python гласит: «Если вы хотите максимальной совместимости между клиентами и серверами, рекомендуется использовать PROTOCOL_SSLv23 в качестве версии протокола», что неверно.Это вызывает недопустимую ошибку сертификации при использовании этой версии протокола.Версия протокола ssl.PROTOCOL_TLSv1 отлично работает в моем случае.

Нахождение 5: В документе Python говорится, что выдавать сертификат в виде «строки ASCII PEM», что неверно.Мы должны дать Unicode-строку.

Вот код для справки:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
reload(sys) 
sys.setdefaultencoding("utf-8")
import os
from os import path
import urllib
import urllib2
import ssl

import traceback
import shutil


def loadCA():

    concatedCA = u'''
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAXxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----
'''

    return  concatedCA


cadata = loadCA()

try:

    url="https://stackoverflow.com/"


    https_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    https_context.verify_mode = ssl.CERT_NONE
    https_context.check_hostname = False
    https_context.load_verify_locations(cadata=cadata)

    https_handler = urllib2.HTTPSHandler(debuglevel=1,context=https_context)

    redirect_handler = SmartRedirectHandler()

    opener = urllib2.build_opener(https_handler,redirect_handler)
    rep=opener.open(url)

except Exception, e:
    traceback.print_exc()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...