Program Tip

TLS와 함께 요청을 사용하면 SNI 지원이 제공되지 않습니다.

programtip 2020. 11. 29. 12:12
반응형

TLS와 함께 요청을 사용하면 SNI 지원이 제공되지 않습니다.


django 앱과 통신하기 위해 요청을 사용하고 있지만

내가 시도 할 때

requests.get('https://mysite.com', verify=True)

오류가 발생합니다.

호스트 이름 'mysite.com'이 '* .myhost.com', 'myhost.com'중 하나와 일치하지 않습니다.

그러나 브라우저 또는 http://www.digicert.com/help/를 보면 인증서가 멋지고 멋지게 보입니다.

내 호스트는 요청에서 SNI 지원이 부족하다고 제안했습니다 (그리고 Github는 https://github.com/kennethreitz/requests/issues/749 를 확인하는 것 같습니다 ). 누구든지 요청을 사용하여 해결 방법을 찾았습니까?


현재 버전의 요청은 SNI에서 문제가 없습니다. GitHub 문제에서 더 아래로 요구 사항을 볼 수 있습니다.

해당 패키지를 설치 한 다음 다시 시도하십시오.

편집 : 요청 v2.12.1부터 ndg-httpsclient 및 pyasn1이 더 이상 필요하지 않습니다. 이제 필수 패키지의 전체 목록은 다음과 같습니다.

  • pyOpenSSL
  • idna

작업에 대한 응답을 받기 위해 다음과 같은 순서로 다른 패키지를 설치해야했습니다.

  • yum 설치 libffi-devel
  • yum gcc 설치
  • yum 설치 openssl-devel
  • pip 설치 urllib3
  • pip 설치 pyopenssl
  • pip install ndg-httpsclient
  • pip 설치 pyasn1

이와 같은 요청 모듈을 설치하십시오. 보안 패키지 추가가 설치됩니다.

pip install requests[security]


또는 Python 2.7.9 이상을 사용할 수 있습니다.

"Python 3.4의 ssl 모듈 전체가 Python 2.7.9 용으로 백 포트되었습니다. 정당화는 PEP 466을 참조하십시오."

https://www.python.org/downloads/release/python-279/


@Lukasa 대답은 현재 (github에서) 요청에 맞습니다. 그가 언급 한 pip 종속성과는 별도로 시스템에 OpenSSL을 추가하는 것을 잊지 마십시오.

배포상의 이유로 pip의 1.2.3과 같은 안정적인 요청 버전을 선호하는 경우 다음과 같이 SNI와 함께 작동하도록 원숭이 패치를 적용 할 수 있습니다.

import requests


def fileno(self):
    return self.socket.fileno()


def close(self):
    return self.connection.shutdown()


requests.pyopenssl.WrappedSocket.close = close
requests.pyopenssl.WrappedSocket.fileno = fileno

IP 주소로 https 사이트 액세스 에서 내 대답 복사

MAC High Sierra 및 Python 3.6.4에서 솔루션을 시도했습니다. requests toolbelt : HostHeaderSSLAdapter 1st, 안타깝게도 작동하지 않습니다. 그리고 forcediphttpsadapter를 시도 하여 마침내 작동했습니다.

작성자는 readme 부분의 모든 내용을 설명하고 샘플 스크립트를 제공했으며 쉽게 따라 할 수 있습니다.

1. 라이브러리 설치 pip install requests[security] forcediphttpsadapter

2. 샘플 스크립트를 실행합니다.

import requests
from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter
session = requests.Session()
session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4'))
response = session.get(
    '/some/path', headers={'Host': 'example.com'}, verify=False)

Note: For some cases, you may need to remove the prefix: 'www' from the url.

참고URL : https://stackoverflow.com/questions/18578439/using-requests-with-tls-doesnt-give-sni-support

반응형