Ошибка SSL (порт с Python 2.7.15 на Python 3.7.7) — Ошибка HTTP 401: ошибка проверки сообщения

#python #ssl

#python #ssl

Вопрос:

При переносе кода с Python 2.7.15 на Python 3.7.7 у меня возникли проблемы с получением наших SSL-вызовов для работы при подключении к внутреннему серверу.

Запуская этот код в каждой версии Python, я получаю:

 import socket, ssl

context =  context = ssl.create_default_context()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
domain = 'xxx.yyy.com'
sslSocket = context.wrap_socket(s, server_hostname = domain)
sslSocket.connect((domain, 443))
print('the selected version by the server: ', sslSocket.cipher()[1])
  

Результат в Python 2.7.15 —

(‘выбранная сервером версия: ‘, ‘TLSv1 / SSLv3’)

Результат в Python 3.7.7 —

выбранная сервером версия: TLSv1.2

Кроме того, я настраиваю контекст следующим образом для своих вызовов SSL:

 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
  

Как я могу настроить свой контекст в 3.7.7, чтобы удовлетворить сервер?

Спасибо за любую помощь! С уважением, Майкл

Штеффен, спасибо за вашу помощь! Я потратил время на расследование и опубликовал журнал отладки. В Python 3.7 первый вызов self._open() в URLIIIB2.open() возвращает объект обработчика ошибок, который содержит код ошибки 401. Я не уверен, что это полезно — если мне нужно предоставить другую информацию, пожалуйста, дайте мне знать … спасибо. У меня есть гораздо больше информации о содержимом структуры и т.д., Но я не хочу перегружать. Пожалуйста, дайте мне знать, чего мне не хватает…

Я включил ведение журнала с помощью следующего кода:

 import requests
import logging
from http.client import HTTPConnection  # py3
log = logging.getLogger('urllib3')
log.setLevel(logging.DEBUG)
# logging from urllib3 to console
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
log.addHandler(ch)
# print statements from `http.client.HTTPConnection` to console/stdout
HTTPConnection.debuglevel = 1
requests.get('http://httpbin.org/')
  

Вот информация о протоколировании из каждого теста:

 Python 2.7.15
Starting new HTTP connection (1): httpbin.org:80
send: 'GET / HTTP/1.1rnHost: httpbin.orgrnConnection: keep- 
alivernAccept-Encoding: gzip, deflaternAccept: */*rnUser-Agent: python- requests/2.19.1rnrn'
http://httpbin.org:80 "GET / HTTP/1.1" 200 9593
reply: 'HTTP/1.1 200 OKrn'
header: Date: Thu, 20 Aug 2020 19:53:40 GMT
header: Content-Type: text/html; charset=utf-8
header: Content-Length: 9593
header: Connection: keep-alive
header: Server: gunicorn/19.9.0
header: Access-Control-Allow-Origin: *
header: Access-Control-Allow-Credentials: true


Python 3.7.7
Starting new HTTP connection (1): httpbin.org:80
send: b'GET / HTTP/1.1rnHost: httpbin.orgrnUser-Agent: python- requests/2.22.0rnAccept-Encoding: gzip, deflaternAccept: */*rnConnection:keep-alivernrn'
http://httpbin.org:80 "GET / HTTP/1.1" 200 9593
reply: 'HTTP/1.1 200 OKrn'
header: Date: Thu, 20 Aug 2020 20:40:58 GMT
header: Content-Type: text/html; charset=utf-8
header: Content-Length: 9593
header: Connection: keep-alive
header: Server: gunicorn/19.9.0
header: Access-Control-Allow-Origin: *
header: Access-Control-Allow-Credentials: true
exception HTTP Error 401: Message validation failed
  

Ответ №1:

Я думаю, вы ищете причину вашей проблемы не в том месте.

Поскольку вы получили код 401 обратно, это означает, что был получен HTTP-ответ. Это означает, что в случае HTTPS должно было быть успешно выполнено подтверждение связи TLS, поскольку в противном случае данные приложения (и, следовательно, HTTP-ответ) не могли быть получены. Следовательно, проблема, скорее всего, не в квитировании TLS, а позже — в коде, который вы не показываете.