Отключите проверку SSL для публикации данных в IronPython - PullRequest
1 голос
/ 30 марта 2019

Мы недавно перешли на новую платформу разработки.Мы все еще настраиваем некоторые части для всего нашего рабочего процесса, чтобы работать без проблем.У нас есть одна проблема, когда нам нужно продвинуть проект в производство, но мы продолжаем получать ошибку на сервере.Наша команда не очень хорошо разбирается в IronPython, чтобы легко решить эту проблему.

Я редактирую сценарий, связанный с этим.Оригинальный сценарий выглядит следующим образом: (Обратите внимание, что я отредактировал / удалил конфиденциальные и ненужные части)

def callWebService(URI, setProjectState): 
    job = jobs[0]
    job.AddNote(0, job.CurrentVersion, ('%s.' % (job.Id)))

    PARAMETERS='{"id": "%s", "someData": "%s"}' % (job.Id, setProjectState)

    from System.Net import WebRequest
    request = WebRequest.Create(URI)
    request.ContentType = "application/json"
    request.Method = "POST"

    from System.Text import Encoding
    bytes = Encoding.ASCII.GetBytes(PARAMETERS)
    request.ContentLength = bytes.Length
    reqStream = request.GetRequestStream()
    reqStream.Write(bytes, 0, bytes.Length)
    reqStream.Close()

    response = request.GetResponse()

    from System.IO import StreamReader
    result = StreamReader(response.GetResponseStream()).ReadToEnd()
    print result
    return; 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12   

callWebService('https://somesite.com/needtoposthere', 'Production')

Поддержка новой платформы сказала нам, что для решения этой проблемы нам нужно обойти проверку sslчасть, потому что только в этой части нашего рабочего процесса мы публикуем данные на URL-адрес HTTPS с момента его создания.

Я пробовал множество способов, таких как добавление кода ff:

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context

Также попытался вставить этот файл в соответствии с рекомендациями службы поддержки:

from System.Net import ServicePointManager
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

и

from System.Net import ServicePointManager
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072

Я также пытался использовать verify = false библиотеки ssl, но все еще продолжаю получать ошибки.

Для первого решения, я получаю сообщение об ошибке: модуль ssl не может быть импортирован.Журналы показывают ошибку module named "ssl" cannot be found". Я попытался объявить импорт таким же, как и другие объявления импорта: from System.Net import ssl, но все равно получаю ту же ошибку.

Для второго решения сценарий не может распознать SecurityProtocolType, даже если ServicePointManager был успешно импортирован.

Я не понимаю, почему я не могу импортировать даже встроенные библиотеки Python (ssl).Пожалуйста, поймите, что выложенный мною сценарий - единственный, который мы можем изменить, поскольку у нас вообще нет доступа к другим сценариям.

1 Ответ

0 голосов
/ 30 марта 2019

При использовании WebRequest .NET вы обходите всю SSL / TLS-инфраструктуру, которая может быть в стандартном python, и вам необходимо изменить настройки SSL / TLS на стороне .NET.

Учитывая, что модуль ssl не было найдено, что он либо не находится в пути поиска модуля, либо несовместим с IronPython (поскольку он может быть встроенным).

Предупреждение : в следующем примере отключена вся проверка сертификата и он НЕ ПОДХОДИТ ДЛЯ ПРОИЗВОДСТВА Кроме того, он ограничивает версию SSL / TLS только до 1.2.

from System.Net import ServicePointManager, SecurityProtocolType
ServicePointManager.ServerCertificateValidationCallback = lambda sender, certificate, chain, sslPolicyErrors: True
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

Если возможно, следует избегать полного отключения проверки сертификата и выполнять хотя бы какую-то проверку отпечатка пальца, что означаетчто вы закрепляете и допускаете только один, ожидаемый, не полностью действительный сертификат разработки.Это может выглядеть примерно так:

def certificateCheck(sender, certificate, chain, sslPolicyErrors):
    # check for certificate whitelist, specific root certificate etc.
    # print certificate
    return certificate.Thumbprint == "..."

ServicePointManager.ServerCertificateValidationCallback = certificateCheck
...