TLS SNI μ§μμ΄ νμν μλ²μμ μμ²μ μ¬μ©νλ λ° λ¬Έμ κ° μλ κ² κ°μ΅λλ€. μΈμ μμ²μ μ΄ κΈ°λ₯μ΄ ν¬ν¨λ©λκΉ? μ΄κ²μ κ³νλ μΌμ λκΉ?
κ°μ¬ ν΄μ,
--λ¨
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λ₯Ό νμ±ννλ κΈ°λ³Έμ μΌλ‘ λ κ°μ§ λμμ΄ μμ΅λλ€.
μμ²μ λν΄ μ νΈνλ κ²μ΄ 무μμΈμ§ μκ³ μΆμ§λ§ λ κ°μ§ λμμ λͺ¨λ ꡬννλ λ° λ¬Έμ κ° μμ΅λλ€. μ λ κ°μΈμ μΌλ‘ λ λ²μ§Έ λμμ ν¬νν©λλ€.
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_urllib3contrib ν¨ν€μ§λ κΈ°λ³Έμ μΌλ‘ κ°μ Έμ€μ§ μμ΅λλ€.
μμ²μμ 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 μ€ν ν. νμ μ΄ λ©μΆμ§ μλλ€λ©΄ κΏμ κΎΈκ³ μλ κ²μ λλ€.
μ μ κ°μ λ¬Έμ λ₯Ό κ²ͺμ μ μλ λ€λ₯Έ μ¬λλ€μ μν΄ λκΈμ λ¨κ²¨μ£ΌμΈμ.
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 μ μ§μ λμ΄ μμ΅λλ€.
(λλ νμ μλνλ 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μ μ κ±°νλ κ²μ
λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄κ²μ requests/packages/urllib3/contrib/pyopenssl.py μ μ§μ λμ΄ μμ΅λλ€.
(λλ νμ μλνλ python3.2 μ΄μ)