Requests: TLS SNI 지원

에 λ§Œλ“  2012λ…„ 08μ›” 01일  Β·  46μ½”λ©˜νŠΈ  Β·  좜처: psf/requests

TLS SNI 지원이 ν•„μš”ν•œ μ„œλ²„μ—μ„œ μš”μ²­μ„ μ‚¬μš©ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ–Έμ œ μš”μ²­μ— 이 κΈ°λŠ₯이 ν¬ν•¨λ©λ‹ˆκΉŒ? 이것은 κ³„νšλœ μΌμž…λ‹ˆκΉŒ?

감사 ν•΄μš”,
--램

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이것은 requests/packages/urllib3/contrib/pyopenssl.py 에 μ§€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • pyOpenSSL(0.13으둜 ν…ŒμŠ€νŠΈ)
  • ndg-httpsclient(0.3.2둜 ν…ŒμŠ€νŠΈ)
  • pyasn1(0.1.6으둜 ν…ŒμŠ€νŠΈ)

(λ˜λŠ” 항상 μž‘λ™ν•˜λŠ” python3.2 이상)

λͺ¨λ“  46 λŒ“κΈ€

stdlib의 ssl λͺ¨λ“ˆ μœ„μ— μžˆλŠ” Python 2.xμ—μ„œλŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

νŠΈμœ„μŠ€νŠΈ, 맞죠? μ•„λ§ˆλ„ pyopenssl λ˜λŠ” λ‹€λ₯Έ SSL λͺ¨λ“ˆμ— μ˜μ‘΄ν•  μ‹œκ°„μž…λ‹ˆκΉŒ?

Py32+에 λŒ€ν•œ SNI 지원을 μΆ”κ°€ν•˜λŠ” urllib3에 λŒ€ν•œ ν’€ μš”μ²­μ΄ μžˆμ§€λ§Œ μ—¬μ „νžˆ ν…ŒμŠ€νŠΈ 컀버리지가 ν•„μš”ν•©λ‹ˆλ‹€. https://github.com/shazow/urllib3/pull/89

shzow: 포인터 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λΆˆν–‰νžˆλ„ Twisted/Flaskλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 즉, 2.7에 κ³ μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. νŠΈμœ„μŠ€νŠΈλŠ” 이와 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμ§€λ§Œ 예제λ₯Ό λ³Έ 적이 μ—†μœΌλ©° 이λ₯Ό μˆ˜ν–‰ν•˜λ €λ©΄ pyopenssl + νŠΈμœ„μŠ€νŠΈ 디코딩이 ν•„μš”ν•©λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μ „λ¬Έκ°€κ°€ μ•„λ‹™λ‹ˆλ‹€. 이 μ‹œμ μ—μ„œ wgetκ³Ό 같은 일뢀 λͺ…령쀄 μœ ν‹Έλ¦¬ν‹°λ₯Ό λž˜ν•‘ν•˜λŠ” 것을 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€... :(

PyOpenSSL은 2.xμ—μ„œ 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ 희망이 μžˆμŠ΅λ‹ˆλ‹€.

pyopensslκ³Ό ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬μ „νžˆ μ œλŒ€λ‘œ 된 νŠΈμœ„μŠ€νŠΈ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 어렀움을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. http://pbin.be/show/719/ -- μΌμ’…μ˜ μž‘ν’ˆ. κ·ΈλŸ¬λ‚˜ μœ μš©ν•˜λ €λ©΄ APIλ₯Ό λΉŒλ“œν•΄μ•Ό ν•©λ‹ˆλ‹€. μ—μ΄μ „νŠΈμ—κ²Œ μ˜¬λ°”λ₯Έ μ»¨ν…μŠ€νŠΈλ₯Ό μ „λ‹¬ν•˜λŠ” 방법을 μ—¬μ „νžˆ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

루카사: ν•΄κ²°λ˜μ—ˆλ‚˜μš”?

μ•„λ‹ˆμ˜€. μš°λ¦¬λŠ” shazow/urllib3#89μ—μ„œ μ°¨λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

병합됨. κ³„μ†ν•˜μ‹­μ‹œμ˜€. :)

μ§€κΈˆμ€ Py32+μ—μ„œλ§Œ μ§€μ›λ©λ‹ˆλ‹€. κ·Έλž˜λ„ μ‹œμž‘ν•˜κΈ°μ— μΆ©λΆ„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

또 λ‹€λ₯Έ κ³΅μ •ν•œ κ²½κ³ : Py32에 λŒ€ν•œ 일뢀 ν…ŒμŠ€νŠΈκ°€ ν˜„μž¬ urllib3 λ§ˆμŠ€ν„°μ—μ„œ μ‹€νŒ¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 도움을 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€(이 κΈ°λŠ₯에 영ν–₯을 λ―ΈμΉ  수 있음): https://github.com/shazow/urllib3/issues/128

py26, py27, py32, py33의 archlinux x64μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€.

μ•„, 이것이 OSX에 μžˆλ‹€λŠ” 것을 μΈμ¦ν–ˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. μ“°λ ˆκΈ° OSX.

t-8ch: sni ν…ŒμŠ€νŠΈκ°€ py26/27/32 및 33을 ν†΅κ³Όν•©λ‹ˆκΉŒ?

SNI ν…ŒμŠ€νŠΈλŠ” py2μ—μ„œλ„ μ‹€ν–‰λ˜μ§€ μ•Šμ§€λ§Œ py32 및 py33μ—μ„œλŠ” μž‘λ™ν•©λ‹ˆλ‹€.
py32 μ΄μ „μ—λŠ” ν‘œμ€€ 라이브러리의 ssl λͺ¨λ“ˆλ‘œ SNIλ₯Ό μˆ˜ν–‰ν•  수 μžˆλŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€.

@shazow : μ•„λ§ˆλ„ urllib3을 PyOpenSSL에 μ˜μ‘΄ν•˜κ²Œ λ§Œλ“œλŠ” 데 관심이 μ—†μŠ΅λ‹ˆκΉŒ?

PyOpenSSL 지원을 톡해 urllib3에 SSL을 μΆ”κ°€ν•˜λŠ” λ³„λ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 있으면 μ’‹κ² μŠ΅λ‹ˆλ‹€.

@t-8chκ°€ urllib3에 λŒ€ν•œ μž‘μ—…μœΌλ‘œ 곡원 λ°–μœΌλ‘œ λ…Έν¬ν•˜κ³  μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ–Έμ œ 닫을 수 μžˆλŠ”μ§€ μ•Œλ €λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

urllib3μ—λŠ” λͺ‡ 가지 선택적 쒅속성이 μžˆμ§€λ§Œ python2와 ν•¨κ»˜ SNI에 λŒ€ν•œ 선택적 지원이 μžˆμŠ΅λ‹ˆλ‹€. ( urllib3#156 μ°Έμ‘°).

λ‚˜λŠ” 이것이 λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μž‘λ™ν•΄μ•Όν•œλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

from requests.packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3

이것을 setup.py packages 에 μΆ”κ°€ν•œ ν›„

requests.packages.urllib3.contrib

contrib νŒ¨ν‚€μ§€λŠ” 기본적으둜 κ°€μ Έμ˜€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš”μ²­μ—μ„œ SNIλ₯Ό ν™œμ„±ν™”ν•˜λŠ” 기본적으둜 두 가지 λŒ€μ•ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • 기본적으둜 μœ„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” SNIλ₯Ό μˆ˜λ™μœΌλ‘œ ν™œμ„±ν™”ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“­λ‹ˆλ‹€. (단점은 μ‚¬μš©μžκ°€ SNI 지원을 λͺ…μ‹œμ μœΌλ‘œ ν™œμ„±ν™”ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.)
  • μ „μ œ 쑰건을 κ°€μ Έμ˜€μ‹­μ‹œμ˜€. μ‘΄μž¬ν•˜λŠ” 경우 SNIλ₯Ό ν™œμ„±ν™”ν•˜κ³  그렇지 μ•ŠμœΌλ©΄ ν™œμ„±ν™”ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€.

μš”μ²­μ— λŒ€ν•΄ μ„ ν˜Έν•˜λŠ” 것이 무엇인지 μ•Œκ³  μ‹Άμ§€λ§Œ 두 가지 λŒ€μ•ˆμ„ λͺ¨λ‘ κ΅¬ν˜„ν•˜λŠ” 데 λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ €λŠ” 개인적으둜 두 번째 λŒ€μ•ˆμ— νˆ¬ν‘œν•©λ‹ˆλ‹€.

BTW: 이제 urllib3μ—μ„œ 지원을 λ°›μ•˜μœΌλ‹ˆ 문제λ₯Ό λ‹€μ‹œ μ—΄ 수 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚˜λŠ” 그것을 ν•„μš”λ‘œ ν•˜λŠ” μ‚¬λžŒλ“€μ΄ 그것을 ν•„μš”λ‘œ ν•œλ‹€λŠ” 것을 μ•„λŠ” μ‚¬λžŒλ“€μ΄κ³  그것이 λ„ˆλ¬΄ λ§Žμ€ λΆˆλ§Œμ„ μ•ΌκΈ°ν•˜μ§€ μ•Šμ„ 만큼 μΆ©λΆ„νžˆ 적기 λ•Œλ¬Έμ— λ‚˜λŠ” μ‹€μ œλ‘œ μ „μžλ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κΈ°μ‘΄ API와 일관성을 μœ μ§€ν•˜λ €λ©΄ ν›„μžκ°€ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법이 될 κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ urllib3(및 μš”μ²­)은 ssl λͺ¨λ“ˆ 없이 HTTPS μš”μ²­μ„ λ³΄λ‚΄λŠ” APIλ₯Ό μ œκ³΅ν•˜μ§€λ§Œ ssl λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μ—†λŠ” 경우 μ‹€νŒ¨ν•©λ‹ˆλ‹€. 즉, APIκ°€ 있고 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° μ˜ˆμ™Έλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.

이것을 λ‹€μ‹œ μ—¬λŠ” 것은 @kennethreitz에 달렀 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  (이 λͺ¨λ“  것과 ν•¨κ»˜) λ¬Έμ œλŠ” μš°λ¦¬κ°€ ν˜„μž¬ κΈ°λŠ₯ 동결(#1165, #1168) μƒνƒœμ— μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ κ·Έ μž‘μ—…μ΄ 받아듀여지지 μ•Šμ„ 수 있기 λ•Œλ¬Έμ— κ·Έ μž‘μ—…μ΄ κ°€μΉ˜κ°€ μžˆλŠ”μ§€ ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ’€ 더 λͺ…ν™•ν•˜κ²Œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. 두 번째 λŒ€μ•ˆμ΄ μ˜λ―Έν•˜λŠ” λ°”λŠ” "선택적 depsλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 경우 SNIλ₯Ό μ‚¬μš©ν•˜λ €κ³  μ‹œλ„ν•˜μ§€λ§Œ 항상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” SSL을 계속 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€."μž…λ‹ˆλ‹€. 이것은 μ§€κΈˆκΉŒμ§€ μ‘΄μž¬ν•˜λŠ” μ–΄λ–€ 것도 κΉ¨λœ¨λ¦¬μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

IMHO 문제λ₯Ό λ‹€μ‹œ μ—¬λŠ” 것과 κ΄€λ ¨ν•˜μ—¬ 이 문제λ₯Ό κ°€λ³κ²Œ μ—¬κ²¨μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. μš”μ²­μ€ λ§Žμ€ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ SNI 지원 μ—†μ΄λŠ” μ“Έλͺ¨μ—†κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€. 특히 SNIκ°€ μ—†λŠ” 단일 IPv4 호슀트의 μ—¬λŸ¬ 도메인은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 그리고 μΆ”κ°€ IPv4 μ£Όμ†ŒλŠ” λ§Žμ€ μ‚¬μš©μžμ—κ²Œ λ¬Έμ œκ°€ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(λΉ„μš© λ•Œλ¬Έμ—).

μ–΄μ¨Œλ“  이것은 μ ˆλ°˜μ€ κΈ°λŠ₯이고 μ ˆλ°˜μ€ λ²„κ·Έμ΄μ§€λ§Œ 문제λ₯Ό λ‹€μ‹œ μ—¬λŠ” 것과 κ΄€λ ¨ν•˜μ—¬ κ² μŠ΅λ‹ˆλ‹€ .

Hugo: 방금 pip install -U μš”μ²­μ„ μˆ˜ν–‰ν–ˆλŠ”λ° κΈ°μ—¬λ₯Ό κ°€μ Έμ˜¬ 수 없을 λ•Œμž…λ‹ˆλ‹€.
μ–΄λ–»κ²Œ μˆ˜μ •ν•©λ‹ˆκΉŒ? (κ°€μ Έμ˜€κΈ° 였λ₯˜: contribλΌλŠ” λͺ¨λ“ˆμ΄ μ—†μŠ΅λ‹ˆλ‹€).

2013λ…„ 5μ›” 3일(금) μ˜€ν›„ 1μ‹œ 12λΆ„, Hugo Osvaldo Barrera <
[email protected]>은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

urllib3μ—λŠ” python2κ°€ ν¬ν•¨λœ SNI에 λŒ€ν•œ 선택적 지원이 μžˆμŠ΅λ‹ˆλ‹€.
선택적 쒅속성. (urllib3#156https://github.com/shazow/urllib3/pull/156 μ°Έμ‘°
).

λ‚˜λŠ” 이것이 λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μž‘λ™ν•΄μ•Όν•œλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

requests.packages.urllib3.contribμ—μ„œ pyopenssl κ°€μ Έμ˜€κΈ°
pyopenssl.inject_into_urllib3

contrib νŒ¨ν‚€μ§€λŠ” 기본적으둜 κ°€μ Έμ˜€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš”μ²­μ—μ„œ SNIλ₯Ό ν™œμ„±ν™”ν•˜λŠ” 기본적으둜 두 가지 λŒ€μ•ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • 기본적으둜 μœ„λ₯Ό μ‹€ν–‰ν•˜λŠ” SNIλ₯Ό μˆ˜λ™μœΌλ‘œ ν™œμ„±ν™”ν•˜λŠ” ν•¨μˆ˜ 생성
    μ•”ν˜Έ. (단점은 μ‚¬μš©μžκ°€ SNIλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν™œμ„±ν™”ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
    μ§€μ›ν•˜λ‹€).
  • μ „μ œ 쑰건을 κ°€μ Έμ˜€μ‹­μ‹œμ˜€. μ‘΄μž¬ν•˜λŠ” 경우 SNIλ₯Ό ν™œμ„±ν™”ν•˜κ³  그렇지 μ•Šμ€ 경우
    ν•˜μ§€λ§ˆ.

λ‚˜λŠ” 두 가지 λŒ€μ•ˆμ„ λͺ¨λ‘ κ΅¬ν˜„ν•˜λŠ” 데 λ¬Έμ œκ°€ μ—†μ§€λ§Œ μ„ ν˜Έν•©λ‹ˆλ‹€.
μš”μ²­μ— λŒ€ν•΄ μ„ ν˜Έν•˜λŠ” 것이 무엇인지 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 개인적으둜 νˆ¬ν‘œν•©λ‹ˆλ‹€
두 번째 λŒ€μ•ˆ.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ Gi tHubhttps://github.com/kennethreitz/requests/issues/749#issuecomment -17406518μ—μ„œ ν™•μΈν•˜μ„Έμš”.
.

μš”μ²­μ˜ setup.pyμ—λŠ” ν•΄λ‹Ή νŒ¨ν‚€μ§€(μ†ŒμŠ€κ°€ μžˆμ§€λ§Œ μ„€μΉ˜/νŒ¨ν‚€μ§• μ‹œ μ œμ™Έλ¨)κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ μ„€μΉ˜λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ λ‹€μŒκ³Ό 같이 μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€.

이것을 packages in setup.py μΆ”κ°€ν•œ ν›„
μš”μ²­.νŒ¨ν‚€μ§€.urllib3.contrib

기본적으둜 μ†ŒμŠ€μ—μ„œ μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
관심이 μžˆλ‹€λ©΄ λ‚΄ pull requestλ₯Ό ν™•μΈν•˜μ„Έμš”. 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것은 λͺ‡ 쀄에 λΆˆκ³Όν•©λ‹ˆλ‹€. :)

"선택 사항인 depsλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 경우 SNIλ₯Ό μ‚¬μš©ν•˜λ €κ³  μ‹œλ„ν•˜μ§€λ§Œ 항상 SSL을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ SSL을 계속 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€."

SSL이 항상 μ‘΄μž¬ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 그게 λ‚΄ μš”μ μ΄μ—ˆλ‹€. ν˜„μž¬ μš°λ¦¬λŠ” 그것을 μ‹œλ„ν•˜κ³  μ‚¬μš©ν•˜μ§€λ§Œ μš°λ¦¬κ°€ 그것을 가지고 μžˆμ§€ μ•Šκ³  μ‚¬μš©μžκ°€ https μš”μ²­μ„ ν•˜λ €κ³  ν•˜λ©΄ νž˜λ“€κ³  λΉ λ₯΄κ²Œ μ‹€νŒ¨ν•©λ‹ˆλ‹€. 당신이 그것을 μ„€λͺ…ν•œ λ°©μ‹μœΌλ‘œ, λ‚˜λŠ” SNIκ°€ μ‚¬μš©μžμ—κ²Œ μ•½κ°„μ˜ μΆ”κ°€ κ°œλ…μ„ urllib3에 μ „λ‹¬ν•˜λ„λ‘ μš”κ΅¬ν•  κ²ƒμ΄λΌλŠ” 인상을 λ°›μ•˜κ³  당신은 그것에 λŒ€ν•œ μ„€μ •μ—λ§Œ μ§‘μ€‘ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•„μš”ν•œ λͺ¨λ“  것이 # 1347이라면 λ‚˜λŠ” 100 % 뒀에 μžˆμŠ΅λ‹ˆλ‹€.

이것이 κΈ°λ³Έ(SNI 지원) 및 μš”μ²­μ΄λΌλ©΄ 정말 쒋을 κ²ƒμž…λ‹ˆλ‹€.
μ†ŒμŠ€μ—μ„œ μΆ”κ°€ μ½”λ“œλ‚˜ μ„€μ • 없이 μž‘λ™ν•©λ‹ˆλ‹€. urllib3의 경우 2
μ½”λ“œ 쀄. μš”μ²­μ— μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄κ°€ κΏˆμ„ κΎΈκ³  μžˆλŠ” 걸까? :)

2013λ…„ 5μ›” 3일 κΈˆμš”μΌ μ˜€ν›„ 10μ‹œ 43λΆ„, Ian Cordasco [email protected]이 λ‹€μŒκ³Ό 같이 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

"선택적인 depsλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 경우 SNIλ₯Ό μ‚¬μš©ν•˜λ €κ³  μ‹œλ„ν•˜μ§€λ§Œ μ—¬μ „νžˆ SSL을
μš°λ¦¬λŠ” 항상 그것을 가지고 μžˆμŠ΅λ‹ˆλ‹€."

SSL이 항상 μ‘΄μž¬ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 그게 λ‚΄ μš”μ μ΄μ—ˆλ‹€. ν˜„μž¬ μš°λ¦¬λŠ” μ‹œλ„ν•˜κ³ 
그것을 μ‚¬μš©ν•˜μ§€λ§Œ μš°λ¦¬κ°€ 그것을 가지고 μžˆμ§€ μ•Šκ³  μ‚¬μš©μžκ°€ λ§Œλ“€λ €κ³  ν•˜λ©΄ νž˜λ“€κ³  λΉ λ₯΄κ²Œ μ‹€νŒ¨ν•©λ‹ˆλ‹€.
https μš”μ²­. 당신이 그것을 μ„€λͺ…ν•œ λ°©μ‹μœΌλ‘œ, λ‚˜λŠ” μ•„λž˜μ— μžˆμ—ˆλ‹€
인상 SNIλŠ” μ‚¬μš©μžκ°€ urllib3에 λͺ‡ 가지 μΆ”κ°€ κ°œλ…μ„ μ „λ‹¬ν•˜λ„λ‘ μš”κ΅¬ν•©λ‹ˆλ‹€.
그리고 당신은 단지 그것을 μœ„ν•œ μ„€μ •μ—λ§Œ μ§‘μ€‘ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  것이 ν•„μš”ν•œ 경우
https://github.com/kennethreitz/requests/issues/1347 은 #1347이고 μ €λŠ”
100% 뒀에 μžˆμŠ΅λ‹ˆλ‹€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ Gi tHubhttps://github.com/kennethreitz/requests/issues/749#issuecomment -17426626μ—μ„œ ν™•μΈν•˜μ„Έμš”.
.

@pythonmobile μŠ€ν•€ 탑. νšŒμ „μ΄ λ©ˆμΆ”μ§€ μ•ŠλŠ”λ‹€λ©΄ κΏˆμ„ κΎΈκ³  μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

inception

저와 같은 문제λ₯Ό κ²ͺ을 수 μžˆλŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€μ„ μœ„ν•΄ λŒ“κΈ€μ„ λ‚¨κ²¨μ£Όμ„Έμš”.
requests 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΄μ•ˆ μš”μ²­μ„ ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆλŠ” 경우, 특히 Google App Engineμ—μ„œ ν˜ΈμŠ€νŒ…λ˜λŠ” 앱을 μ‘°νšŒν•˜λ €κ³  ν•  λ•Œ 이것이 κ·Έ 이유일 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ λ³Έ 였λ₯˜λŠ” "EOFκ°€ ν”„λ‘œν† μ½œμ„ μœ„λ°˜ν•˜μ—¬ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€"μ˜€μŠ΅λ‹ˆλ‹€. 이λ₯Ό μ§„λ‹¨ν•˜λ €λ©΄ s_client μ‚¬μš©ν•˜μ—¬ λ™μΌν•œ ν˜ΈμŠ€νŠΈμ— 접속해 λ³΄μ‹­μ‹œμ˜€( example.com λ₯Ό ν•΄λ‹Ή 호슀트둜 ꡐ체).

openssl s_client -connect example.com:443
openssl s_client -connect example.com:443 -servername example.com

첫 번째 λͺ…령이 "ν•Έλ“œμ…°μ΄ν¬ μ‹€νŒ¨"둜 μ‹€νŒ¨ν•˜κ³  두 번째 λͺ…령이 μ„±κ³΅ν•˜λ©΄ SNIλ₯Ό μ‚¬μš©ν•˜λŠ” μ„œλ²„λ₯Ό κ³΅κ²©ν•˜λ €λŠ” κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ μŠ€λ ˆλ“œμ—λŠ” 이 μƒν™©μ—μ„œ requests μž‘λ™μ‹œν‚€λŠ” 방법에 λŒ€ν•œ 쒋은 정보가 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ ν•œ 것은 ipythonμ—μ„œ from requests.packages.urllib3.contrib import pyopenssl λ₯Ό μ‹€ν–‰ν•˜λ €κ³  μ‹œλ„ν–ˆκ³  κ°€μ Έμ˜€κΈ° 였λ₯˜λ₯Ό μ„€μΉ˜ν•˜λŠ” λ™μ•ˆ 계속 pipλ₯Ό μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. YMMV.

@mshang 버전 1.2.3은 이미 이 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 당신이 κ·Έ 버전을 μ‹€ν–‰ν•˜κ³  μžˆλ‹€κ³  ν™•μ‹ ν•©λ‹ˆκΉŒ?

@hobarrera 예, 1.2.3을 μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€. requests.packages.urllib3.contrib 이 μžˆμ—ˆμ§€λ§Œ ν•΄λ‹Ή import 문은 μ—¬μ „νžˆ β€‹β€‹λ§Žμ€ κ°€μ Έμ˜€κΈ° 였λ₯˜λ₯Ό λ°œμƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€. ndg-httpsclient λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν–ˆλŠ”λ° λ‹€λ₯Έ 것은 μžŠμ–΄λ²„λ ΈμŠ΅λ‹ˆλ‹€.

μ˜³μ€. μš”μ²­μ€ ν•„μš”ν•œ λͺ¨λ“ˆμ„ κ°€μ Έμ˜€λ €κ³  μ‹œλ„ν•˜κ³ , 포기할 수 μ—†μœΌλ©΄ 수λͺ…을 κ³„μ†ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš”μ²­κ³Ό ν•¨κ»˜ SNIλ₯Ό μ‚¬μš©ν•˜λŠ” 데 ν•„μš”ν•œ 사항을 λ¬Έμ„œν™”ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

이것은 requests/packages/urllib3/contrib/pyopenssl.py 에 μ§€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • pyOpenSSL(0.13으둜 ν…ŒμŠ€νŠΈ)
  • ndg-httpsclient(0.3.2둜 ν…ŒμŠ€νŠΈ)
  • pyasn1(0.1.6으둜 ν…ŒμŠ€νŠΈ)

(λ˜λŠ” 항상 μž‘λ™ν•˜λŠ” python3.2 이상)

ν˜„μž¬ SNI에 λŒ€ν•œ μš”μ²­κ³Ό urllib3이 λͺ¨λ‘ μ†μƒλœ 것 κ°™μŠ΅λ‹ˆλ‹€. ν•˜λ‚˜
λ¬Έμ œλŠ” timeout=5.0을 μΆ”κ°€ν•˜λ©΄ μ½”λ“œκ°€ λ‹€μŒκ³Ό λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ‹œκ°„ 초과 없이. 두 번째 λ¬Έμ œλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 도메인에 μžˆμŠ΅λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈλŠ” λ‹€μŒμ— μ˜μ‘΄ν•˜λŠ” 것에 λΉ„ν•΄ 더 λ§Žμ€ SNI 도메인을 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
정점/httpbin/. λ‘˜ λ‹€ SNI μ‚¬μš©μ„ μ „ν˜€ λ°˜μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

2013λ…„ 6μ›” 10일 μ›”μš”μΌ μ˜€μ „ 4:57 Thomas Weißschuh
[email protected]μž‘μ„± :

이것은 requests/packages/urllib3/contrib/pyopenssl에 μ§€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. pyhttps://github.com/kennethreitz/requests/blob/master/requests/packages/urllib3/contrib/pyopenssl.py
:

  • pyOpenSSL(0.13으둜 ν…ŒμŠ€νŠΈ)
  • ndg-httpsclient(0.3.2둜 ν…ŒμŠ€νŠΈ)
  • pyasn1(0.1.6으둜 ν…ŒμŠ€νŠΈ)

(λ˜λŠ” 항상 μž‘λ™ν•˜λŠ” python3.2 이상)

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ Gi tHubhttps://github.com/kennethreitz/requests/issues/749#issuecomment -19187417μ—μ„œ ν™•μΈν•˜μ„Έμš”.
.

@pythonmobile 그런 경우이고 μž¬ν˜„ κ°€λŠ₯ν•œ 쒋은 ν…ŒμŠ€νŠΈ 사둀가 μžˆλŠ” 경우 urllib3μ—μ„œ 이λ₯Ό κ°•μ‘° ν‘œμ‹œν•˜λŠ” 문제λ₯Ό μ—¬μ‹­μ‹œμ˜€. μš”μ²­μ—λŠ” (λ‚΄κ°€ μ•„λŠ” ν•œ) SNI κ΄€λ ¨ μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ μˆ˜μ •ν•˜λ©΄ μš°λ¦¬λ„ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

urllib3κ°€ 이미 κ³ μ •λ˜μ–΄ μžˆμ§€ μ•ŠλŠ” ν•œ, μš”μ¦˜ 많이 μΌμ–΄λ‚˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. Shazow_et. al._ κ½€ ꡉμž₯ν•©λ‹ˆλ‹€. @t-8ch, 이미 λ³΄μ…¨κ±°λ‚˜ μˆ˜μ •ν•˜μ…¨λ‚˜μš”?

μš”μ²­μ— ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄ μž‘μ„± 및 ν…ŒμŠ€νŠΈκ°€ 더 μ‰¬μ›Œμ§€μ§€λ§Œ λŒ€λΆ€λΆ„ urllib3 μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€λŠ” 의미일 λΏμž…λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ©΄ μš”μ²­μ—μ„œ urllib3을 κ°€μ Έμ˜¬ λ•Œλ§ˆλ‹€ sniκ°€ μ†μƒλ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κ³  경보λ₯Ό μšΈλ¦¬λŠ” 것이 더 μ‰¬μšΈ κ²ƒμž…λ‹ˆλ‹€. 곧 μš”μ²­ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

@pythonmobile μ£„μ†‘ν•©λ‹ˆλ‹€. λ™μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. =)

SNIλŠ” λͺ…μ‹œμ μœΌλ‘œ urllib3 κΈ°λŠ₯μž…λ‹ˆλ‹€. urllib3μ—μ„œ SNIκ°€ μ†μƒλœ 경우 ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ— μˆ˜μ • 사항, ν…ŒμŠ€νŠΈ λ˜λŠ” μ΅œμ†Œν•œ 버그 λ³΄κ³ μ„œλ₯Ό μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•΄λ‹Ή ν”„λ‘œμ νŠΈκ°€ μˆ˜μ •λ˜λ©΄ μš”μ²­λ„ λ§ˆλ²•μ²˜λŸΌ μˆ˜μ •λ©λ‹ˆλ‹€(λ‹€μŒμ— μƒλ‹Ήνžˆ 자주 μ—…λ°μ΄νŠΈν•˜λŠ” urllib3을 μ—…λ°μ΄νŠΈν•  λ•Œ). =)

@Lukasaκ°€ λ§ν–ˆλ“―μ΄ μš”μ²­μ— λŒ€ν•œ 더 λ§Žμ€ ν…ŒμŠ€νŠΈκ°€ ν™•μ‹€νžˆ λ¬Έμ œκ°€ λ˜μ§€λŠ”

μš°λ¦¬λŠ” 이미 λΉ„μŠ·ν•œ λ§₯λ½μ—μ„œ λ§Žμ€ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 도움이 ν•„μš”ν•˜λ©΄ μ €μ—κ²Œ 핑을 λ³΄λ‚΄μ£Όμ‹­μ‹œμ˜€.

pyOpenSSL의 μ‹œκ°„ 초과 λ™μž‘μ΄
ν‘œμ€€ SSL λͺ¨λ“ˆ:

from OpenSSL import SSL
import socket
import ssl

sock = socket.create_connection(('httpbin.org', 443), timeout=4.0)
ssl_sock = ssl.wrap_socket(sock)
ssl_sock.send('GET /ip HTTP/1.1\r\nHost: httpbin.org\r\n\r\n')
print(ssl_sock.recv(10000))

ctx = SSL.Context(SSL.TLSv1_METHOD)
sock = socket.create_connection(('httpbin.org', 443), timeout=4.0)
ctn = SSL.Connection(ctx, sock)
ctn.set_connect_state()

ctn.send('GET /ip HTTP/1.1\r\nHost: httpbin.org\r\n\r\n')
print(sock.read(10000))

이것은 WantReadError 을 λ˜μ§‘λ‹ˆλ‹€. urllib3μ—μ„œλ„ λ˜μ§„ 것과 λ™μΌν•©λ‹ˆλ‹€.
μ‹œκ°„ 초과λ₯Ό 지정할 λ•Œ.

λ¬Έμ„œ μ—λŠ”
였λ₯˜μ— λŒ€ν•΄ λ‹€μŒκ³Ό 같이 λ§ν•©λ‹ˆλ‹€.

The operation did not complete; the same I/O method should be called again
later, with the same arguments. Any I/O method can lead to this since new
handshakes can occur at any time.

The wanted read is for dirty data sent over the network, not the clean data
inside the tunnel. For a socket based SSL connection, read means data coming at
us over the network. Until that read succeeds, the attempted
OpenSSL.SSL.Connection.recv, OpenSSL.SSL.Connection.send, or
OpenSSL.SSL.Connection.do_handshake is prevented or incomplete. You probably
want to select() on the socket before trying again. 

μ‹œκ°„ 초과λ₯Ό μ–΄λ””μ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ†ŒμΌ“μ΄ 마술처럼 μž‘λ™ν•©λ‹ˆκΉŒ?
select() ν˜ΈμΆœμ— λŒ€ν•œ μ‹œκ°„ 초과λ₯Ό κΈ°μ–΅ν•˜κ±°λ‚˜ 이것이 μž‘μ—…μž…λ‹ˆλ‹€.
urllib3?
μ‹œκ°„ 초과λ₯Ό μ†μœΌλ‘œ μΆ”μ ν•˜λŠ” 것은 정말 μž¬λ―Έμ—†κ²Œ λ“€λ¦½λ‹ˆλ‹€.

@pythonmobile μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ„λ©”μΈμ΄λž€ 무엇을 μ˜λ―Έν•©λ‹ˆκΉŒ? λ‚˜λŠ” 당신을 λ”°λΌκ°ˆ 수 μ—†μŠ΅λ‹ˆλ‹€.

@pythonmobile shazow/urllib3#233의 λ³€κ²½ 사항을 μ‹œλ„ν•˜κ³  μ½”λ“œκ°€ pyopenssl 및 μ‹œκ°„ μ΄ˆκ³Όμ—μ„œ μž‘λ™ν•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

@t-8ch @pythonmobile : 이 μŠ€λ ˆλ“œλ„ λ³Ό 수 μžˆλ‚˜μš”? https://github.com/kennethreitz/requests/issues/1522#issuecomment -22443282

urllib3 λ˜λŠ” μš”μ²­ λ‚΄λΆ€μ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ—μ„œ μ΄λŸ¬ν•œ μš”μ²­μ„ μ–»λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

이것을 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ‘œ 얻을 λ•Œμ˜ λ¬Έμ œλŠ” 맀우 νŠΉμ •ν•œ κ΅¬μ„±μ—μ„œλ§Œ λ‚˜νƒ€λ‚œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Windows, OS X λ˜λŠ” Ubuntu와 같은 μ‹œμŠ€ν…œμ—μ„œ 이 문제의 ν›„λ°˜λΆ€λ‚˜ #1522λ₯Ό μž¬ν˜„ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ @pythonmobile 에 μž¬ν˜„ κ°€λŠ₯ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μš”μ²­ urllib3 μ—μ„œ λͺ¨λ“  문제λ₯Ό 마술처럼 ν•΄κ²°ν•˜κΈ°λ₯Ό λ°”λΌλŠ” 데 κ°‡νžˆκ²Œ λ©λ‹ˆλ‹€.

주의: @t-8ch, 여기와 urllib3 μ—μ„œ λ‹Ήμ‹ μ˜ 일에 λŒ€ν•΄ μΆ©λΆ„νžˆ κ°μ‚¬ν•˜μ§€ μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 당신은 ꡉμž₯ν•©λ‹ˆλ‹€. =D :케이크: :νŒŒμΈμ• ν”Œ: :λ°”λ‚˜λ‚˜: :μΏ ν‚€: :λ§₯μ£Ό:

@lukasa κ°μ‚¬ν•©λ‹ˆλ‹€ :smile: AUTHORS.txt μΆ”κ°€ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

@t-8ch ν•˜μ„Έμš”. :+1:

shazow/urllib3#233(ν˜„μž¬ urllib3 λ§ˆμŠ€ν„°λ‘œ κ°€μ Έμ˜΄)의 λ³€κ²½ 사항은 일뢀 URLμ—μ„œ λ°œμƒν•˜λŠ” 문제( SSLError('bad handshake', WantReadError()) )λ₯Ό 일뢀 ꡬ성:rage4:μ—μ„œ μˆ˜μ •ν•©λ‹ˆλ‹€. 이것을 μš”μ²­ λ§ˆμŠ€ν„°λ‘œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆκΉŒ?

@rcoup 2.0을 λ¦΄λ¦¬μŠ€ν•˜λ©΄ μš”μ²­μ— μ΅œμ‹  버전을 κ°€μ Έμ˜¬ κ²ƒμž…λ‹ˆλ‹€. =)

Python 2.7.6을 μ‹€ν–‰ 쀑이며 pyOpenSSL을 μ„€μΉ˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€. htis κ²Œμ‹œλ¬Ό -> https://stackoverflow.com/questions/18578439/using-requests-with-tls-doesnt-give-sni-support/18579484#18579484 μ—μ„œ ν•΄κ²° 방법을 μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.

νŒŒμ΄μ¬μœΌλ‘œλ„ μ—…κ·Έλ ˆμ΄λ“œν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ†”λ£¨μ…˜μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

"inject_into_urllib3()"의 무쑰건적인 μ‚¬μš©(μžˆλŠ” 경우)을 μž¬κ³ ν•  것을 μš”μ²­ν•©λ‹ˆλ‹€.

7λ…„ 전에 μΆ”κ°€λœ λͺ©ν‘œλŠ” "Python 2에 λŒ€ν•œ SNI 지원 μΆ”κ°€"μ˜€μŠ΅λ‹ˆλ‹€.

"urllib3.contrib.pyopenssl.inject_into_urllib3()"은 "PyOpenSSL 지원 SSL μ§€μ›μœΌλ‘œ urllib3을 μ›μˆ­μ΄ 패치"둜 μ„€λͺ…ν•©λ‹ˆλ‹€.
(https://github.com/urllib3/urllib3/blob/master/src/urllib3/contrib/pyopenssl.py)

μ •λ‹Ήν™”:
1: λ³΄μ•ˆ/μ•ˆμ •μ„±: 타사 λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ ν‘œμ€€ 라이브러리 μ‚¬μš©μ„ κ΅μ²΄ν•˜κΈ° μœ„ν•œ μ›μˆ­μ΄ νŒ¨μΉ˜λŠ” 특히 ssl의 경우 틀림없이 더 외과적이어야 ν•©λ‹ˆλ‹€. νŒ¨μΉ˜κ°€ Python2μ—μ„œ 지원을 μœ„ν•œ 것이라면 μ΅œμ†Œν•œ μ£Ό 버전을 ν™•μΈν•˜μ‹­μ‹œμ˜€. λ˜λŠ” 더 λ‚˜μ€ λ°©λ²•μœΌλ‘œ SNI 지원이 이미 ssl.HAS_SNI μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

2: λΆˆν•„μš”: 2014λ…„ 12μ›” 10일뢀터 Python 3.4의 ssl λͺ¨λ“ˆ 전체가 Python 2.7.9용으둜 λ°±ν¬νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 정당성은 PEP 466을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. https://www.python.org/downloads/release/python-279/. 이것은 > v2.7.9에 λŒ€ν•œ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ SNI 지원을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

3: μœ μ—°ν•˜μ§€ μ•ŠμŒ: κ΅¬ν˜„λœ λŒ€λ‘œ 이 λ™μž‘μ„ λΉ„ν™œμ„±ν™”ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€. requests pyopenssl μ»¨ν…μŠ€νŠΈμ˜ μ‚¬μš©μ„ λ°©μ§€ν•˜λŠ” μœ μΌν•œ μ˜΅μ…˜μ€ 전체 Python ν™˜κ²½μ—μ„œ pyopenssl을 μ œκ±°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰