λ€μμ 첫 λ²μ§Έ λ¬Έμ μ
λλ€.
https://github.com/kennethreitz/requests/issues/2906
νμ΄μ¬ 3.5.1(https://www.python.org/downloads/) Virtualenv 14.0.5 Mac OS X 10.11.3
λ¨Όμ virtualenvμ pip install requests[security]
λ§λ€μμ΅λλ€.
κ·Έλ° λ€μ λλ
>>> from cryptography.hazmat.backends.openssl.backend import backend
>>> print(backend.openssl_version_text())
OpenSSL 1.0.2f 28 Jan 2016
λ΄κ° μμνλ κ²μ λλ€.
λͺ¨λ κ²μ΄ μ½ ν μκ° λμ μ μλνμ΅λλ€.
κ·Έλ° λ€μ μ μμ μΈ μ€ν¬λ¦½νΈ μ€ μΌλΆκ° μΆ©λνμ΅λλ€. κ·Έ ν μ€ν¬λ¦½νΈλ₯Ό λ€μ μ€ννλ €κ³ νλ©΄ λ€μκ³Ό κ°μ μμΈκ° λ°μν©λλ€.
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
κ·Έλμ λ€λ₯Έ Python μ½μμ μ΄κ³
>>> requests.get("https://www.google.com")
<Response [200]>
>>> requests.get("https://www.telegram.org")
Traceback (most recent call last):
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 559, in urlopen
body=body, headers=headers)
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 345, in _make_request
self._validate_conn(conn)
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 784, in _validate_conn
conn.connect()
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 252, in connect
ssl_version=resolved_ssl_version)
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 305, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
_context=self)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "VirtualenvPath/lib/python3.5/site-packages/requests/adapters.py", line 376, in send
timeout=timeout
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 588, in urlopen
raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "VirtualenvPath/lib/python3.5/site-packages/requests/api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "VirtualenvPath/lib/python3.5/site-packages/requests/api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "VirtualenvPath/lib/python3.5/site-packages/requests/sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "VirtualenvPath/lib/python3.5/site-packages/requests/sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "VirtualenvPath/lib/python3.5/site-packages/requests/adapters.py", line 447, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
>>>
κ·Έλμ μ¬λΆν νκ³ μ΄ λͺ¨λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ κ±°νκ³ λ€μ pip μ€μΉνμ΅λλ€. λͺ¨λ κ²μ΄ λ€μ μλνμ΅λλ€.
κ·Έλ¬λ 1μκ° μ λ νμ λμΌν μμΈκ° λ€μ λ°μν©λλ€.
κ·Έλ° λ€μ μ μμ μΈ μ€ν¬λ¦½νΈ μ€ μΌλΆκ° μΆ©λνμ΅λλ€.
κ·Έλ° μΆ©λμ μ΄λ»κ² μκ²Όμ΅λκΉ?
κ·Έ ν μ€ν¬λ¦½νΈλ₯Ό λ€μ μ€ννλ €κ³ νλ©΄ λ€μκ³Ό κ°μ μμΈκ° λ°μν©λλ€.
κ·Έ νμλ μ ν μ€νν μ μμ΅λκΉ?
@ sigmavirus24 λ€νΈμνΉκ³Ό κ΄λ ¨μ΄μλ λ΄ μ½λμ λ²κ·Έ μΌλΏμ
λλ€.
μ΄κ²μ΄ μ§μ§ μμΈμΈμ§ μλλ©΄ λ¨μν μ°μ°μΈμ§ νμ€νμ§ μμ΅λλ€.
κ·Έλ¬λ ν κ°μ§ νμ€ν κ²μ μ΄λ μμ μ΄ μ§λλ©΄ μ€μΉ μμ² μ§νμ ν μ μλ https://www.telegram.org μ λν μμ²μ μμ ν ν μ μλ€λ κ²μ λλ€.
μ°Έκ³ λ‘: #2906
κ·Έλμ λλ λΉμ μ΄ requests[security]
λ₯Ό μ€μΉνκ³ μλ€λ κ²μ μ§μ νκ³ μΆμ΅λλ€. μ΄κ²μ μ°λ¦¬κ° pyOpenSSLμ μ¬μ©ν΄μΌ νμ§λ§ λΉμ μ μ€ν μΆμ μ μ°λ¦¬κ° κ·Έλ μ§ μλ€λ κ²μ 보μ¬μ€λλ€. ν₯λ―Έλ‘λ€μ.
@sigmavirus24 κ·Έλμ λ΄κ° λΉμ μ λμΈ μμλ μΌμ΄ μμ΅λκΉ?
μ΄λ€ μμ΄λμ΄λΌλ? @루카μ¬
μ¬κΈ°μ κ°μ₯ μ€μν κ²μ μ½λκ° PyOpenSSL μ¬μ©μ μ€λ¨νλ μ΄μ μ
λλ€. μΆ©λμ΄ λ°μνλ©΄ κ°μ νκ²½μμ Python μ½μμ μ΄κ³ import urllib3.contrib.pyopenssl
λ₯Ό μ€ννμ¬ μλνλμ§ νμΈν μ μμ΅λκΉ?
μ§κΈμ μ¬νν μ μμ΅λλ€. λ¨Όμ μ΄κ²μ λ«κ³ λ€μ λ¬Έμ κ° λ°μνλ©΄ κ²°κ³Όλ₯Ό λΆμ¬λ£κ³ λ€μ μ΄κ² μ΅λλ€.
@Lukasa μμ²μ΄ μ체 urllib3μ ν¨κ» μ 곡λκΈ° λλ¬Έμ urllib3μ λ¨λ μΌλ‘ κ°μ Έμ¬ μ μλ€κ³ μκ°ν©λλ€. κ·Έλ¦¬κ³ λ€μ κ²°κ³Όκ° κ·Έκ²μ νμΈμμΌμ€λλ€.
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib3.contrib.pyopenssl
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'urllib3'
>>> ^D
pip list
cffi (1.5.0)
cryptography (1.2.2)
idna (2.0)
ndg-httpsclient (0.4.0)
pip (8.0.2)
pyasn1 (0.1.9)
pycparser (2.14)
pyOpenSSL (0.15.1)
requests (2.9.1)
setuptools (20.0)
six (1.10.0)
wheel (0.26.0)
μ£μ‘ν©λλ€. requests.packages.urllib3.contrib.pyopenssl
κ°μ Έμ€κΈ°λ₯Ό μλν©λλ€.
@루카μ¬
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests.packages.urllib3.contrib.pyopenssl
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 57, in <module>
from socket import _fileobject, timeout, error as SocketError
ImportError: cannot import name '_fileobject'
>>>
λλ κ·Έκ²μ΄ @lukasa μ λν΄ μμ§ λͺ»νλ pyOpenSSLμ μ¬μ©νλ 3.5μ λ²κ·ΈλΌκ³ νμ ν©λλ€( _fileobject
κ° μ‘΄μ¬νμ§ μμ΅λλ€.
μλμ€, μ λ κ·Έκ²μ λν΄ μκ³ μμΌλ©° PyOpenSSL ν
μ€νΈλ₯Ό μμν λ urllib3μμ μ
μ€νΈλ¦Ό μμ μ μ μνμ΅λλ€. νμ€μ requests[security]
κ° Python 3μμ μλνμ§ μμμ΅λλ€.
κ·Έλμ κ·Έκ²μ μ°λ¦¬μ νΌμ¦μ νμ§ λͺ»ν©λλ€. μ μ΄κ²μ΄ μ μ λμ μλνλ€κ° μ€μ§λμμ΅λκΉ?
μλ³Έ λ³΄κ³ μλ₯Ό κΈ°λ°μΌλ‘ ν μ μ μ£Όμ, νμ΄μ¬μ λ΄μ₯ ssl.pyμλ SSL μ°κ²°μ λΉμ μμ μΌλ‘ μ’ λ£νλ μ¬μ΄νΈκ° λ§κΈ° λλ¬Έμ λΆκ·μΉν EOFλ₯Ό μ΅μ νλ μ΅μ μ΄ μμ΅λλ€. λλ‘ κ·Έκ²μ΄ μκΈ°λ μ°μ°μ λ¬Έμ μΈ κ²μ²λΌ λ―Ώμ μ μμ μ λλ‘. λ€μμ ssl.pyμμ μΆμΆν κ²μ λλ€.
class SSLSocket(socket):
[...]
def read(self, len=0, buffer=None):
"""Read up to LEN bytes and return them.
Return zero-length string on EOF."""
self._checkClosed()
if not self._sslobj:
raise ValueError("Read on closed or unwrapped SSL socket.")
try:
return self._sslobj.read(len, buffer)
except SSLError as x:
if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
if buffer is not None:
return 0
else:
return b''
else:
raise
requests
μλμ gevent
requests
λ‘ μλ²λ₯Ό λλ릴 λ Python 2.7.11/OSXμμ λμΌν μμΈκ° λ°μν©λλ€. μ΄κ²μ΄ κ΄λ ¨μ΄μμ μ μμ΅λκΉ?
@the-efiλ³΄κ³ μλ μμΈμ λν΄ λ ꡬ체μ μΌλ‘ λ§μν΄ μ£Όμκ² μ΅λκΉ?
r = requests.post(self.MY_URL, data=parameters)
File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/api.py", line 109, in post
return request('post', url, data=data, json=json, **kwargs)
File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
resp = self.send(prep, **send_kwargs)
File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
raise SSLError(e, request=request)
SSLError: EOF occurred in violation of protocol (_ssl.c:590)
@the-efi pyopenssl
, pyasn1
λ° ndg-httpsclient
μ€μΉλμ΄ μμ΅λκΉ?
pyopenssl: μμ
pyasn1: pyasn1==0.1.8 (μΌμμ , μΆμΈ‘)
ndg-httpsclient: μμ
νμΈ. λΉμ μ λν Python 2.7μ μ€ννκ³ μμΌλ―λ‘ λΉμ κ³Ό ν¬μ€ν°λ λ€λ₯Έ λ¬Έμ λ₯Ό κ²ͺκ³ μλ κ² κ°μ΅λλ€.
μ°κ²° μ€μ μ€μ λ¬Έμ κ° λ°μνλμ§ λλ μ₯κΈ° μ€ν μ°κ²°μμ λ¬Έμ κ° λ°μνλμ§ μκ³ μμ΅λκΉ?
λλ μ΄κ²μ΄ μ°κ²° μ€μ μ€μ΄λΌκ³ μμν μ μμ§λ§ requests
μ΄μ μ μ΄λ¦° μ°κ²°μ Connection: keep-alive
μ ν¨κ» μ¬μ¬μ©νλ©΄ λ΄κ° ν릴 μ μμ΅λλ€.
μμ²μ κ°λ₯ν κ²½μ° μ΄μ μ μ΄λ¦° μ°κ²°μ μ€μ λ‘ μ¬μ¬μ©νλ―λ‘ μ§λ¬Έμ ν κ²μ λλ€. ;)
λΉμ μ κ²½μ°μ μ΄ λ¬Έμ μ ν¨ν· μΊ‘μ²λ₯Ό μ»μ μ μλ€λ©΄ λ§€μ° μ μ©ν κ²μ λλ€. νμ§λ§ κ³ΌλΆν μνμμ λ°μνλ€λ μ μ κ°μν λ κΉλ€λ‘μΈ μ μμ΅λλ€.
λ¬Έμ μμ΅λλ€. μ£Όλ§ μ΄νμ μ΄λ»κ² ν μ μλμ§ μμλ³΄κ² μ΅λλ€. μ λ¬Έμ λ‘ μ μΆνμκ² μ΅λκΉ?
μ, λΆνν©λλ€. =)
@Lukasa urllib3μ μ§μ μ΄ μμ΅λκΉ?
@caizixian μ°λ¦¬λ κ±°κΈ°μ
@Lukasa @shazow urllib3λ μνλ κ²½μ° νμ http://ci.kennethreitz.orgμ μ§μ΄ μμ΅λλ€!
μ΄κ²μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? awsλ‘ μμ ν λ κ½€ λ§μ΄ λ°μν©λλ€.
@mindw λ΄κ° μλ ν μ°λ¦¬λ κ·Έκ²μ΄ μΈμ μ΄λμ μΌμ΄λλμ§ μ νν μ΄ν΄νμ§ λͺ»νκ³ μμ΅λλ€. μμ μμΆμ μμλ μΌλ°μ μΌλ‘ νμμ λ¬Έμ μΈ νΈλμ °μ΄ν¬ μ€μ λ°μν©λλ€. μΈμ μ΄ μ€λ₯κ° λ°μν©λκΉ?
OS X, Python 3.5.1, 2.10.0 + 보μμ μμ²ν©λλ€.
μμ² μ μΆκ° μ 보λ₯Ό μ 곡νλλ‘ λ
Έλ ₯νκ² μ΅λλ€. :)
Traceback (most recent call last):
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 578, in urlopen
chunked=chunked)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 351, in _make_request
self._validate_conn(conn)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 814, in _validate_conn
conn.connect()
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 289, in connect
ssl_version=resolved_ssl_version)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 308, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
_context=self)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/adapters.py", line 403, in send
timeout=timeout
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 604, in urlopen
raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/gabdav01/.virtualenvs/splatt/bin/splatt", line 9, in <module>
load_entry_point('splatt', 'console_scripts', 'splatt')()
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 716, in __call__
return self.main(*args, **kwargs)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 696, in main
rv = self.invoke(ctx)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 1060, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/Users/gabdav01/work/paas/splatt/splatt/cmd.py", line 108, in create
url, json=json, headers=headers)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/sessions.py", line 518, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
μ΄κ²μ SNIκ° μκ±°λ μνΈ κ²ΉμΉ¨μ΄ μμμ κ°λ ₯νκ² μμ¬ν©λλ€. OPμμ μνΈν λͺ λ Ήμ€μ μΈμνκ³ κ·Έ λ΄μ©μ λ§ν΄ μ€ μ μμ΅λκΉ?
μ΄λ»κ² νλ©΄ λ κΉμ?
@mindw @caizixianμ΄ cryptography
μμ λ°±μλλ₯Ό κ°μ Έμ€κ³ OpenSSL λ²μ μ μΈμνλ OP (μλ³Έ κ²μλ¬Ό)λ₯Ό 보μμμ€ .
λνμ΄ λ¬Έμ κ° λ°μν©λλ€. ν΄κ²°μ μν΄ μ΄λ€ μ 보λ₯Ό μ 곡ν μ μμ΅λκΉ?
@LukeNZ λ§μ κ². Python λ²μ , μ€μΉλ ν¨ν€μ§, μμ² λ²μ , OpenSSL λ²μ , μ΄μ 체μ λ° μ°κ²°νλ €λ μΉ μ¬μ΄νΈ.
μλ νμΈμ, λ°©κΈ Requestsλ₯Ό μ¬μ©νκΈ° μμνλλ° μ λ λ§μ°¬κ°μ§μ λλ€. μ λ κ°μ νκ²½μμ OS X 10.11.5, Python 3.5.1, μ΅μ λ²μ μ μμ²μ μ¬μ© μ€μ λλ€. OPμμμ κ°μ΄ open_ssl λ²μ μ μ€ννλ©΄
OpenSSL 1.0.2h 2016λ 5μ 3μΌ
https://api.marketcircle.net/v1/ μ μ°κ²°νλ €κ³ ν©λλ€.
λ§μ μ½λλ₯Ό μμ±νμ§ μκ³ λμμμ Requestsκ° μ μΌν κ²μμΈ κ²μ²λΌ 보μ λλ€. Unirestλ λ μ΄μ Python 3μ©μΌλ‘ μ€μΉνμ§ μμΌλ―λ‘ μ΄ λ¬Έμ κ° κ³§ ν΄κ²°λκΈ°λ₯Ό λ°λλλ€.
@eoco λ€ , ν₯λ―Έ
μΌκ΄λκ² - μμ§ μ±κ³΅μ μΌλ‘ μ°κ²°ν μ μμ΅λλ€.
λ΄ νΈλ μ΄μ€λ°±μ μμ mindwμ λ§€μ° μ μ¬νλ©° μ¬κΈ° νλ¨μ κ²μν©λλ€. κ·Έλ¬λ μ°Έκ³ λ‘ μ λ Python 2.7μ λν μμ²μ μ€μΉνμ¬ ν μ€νΈλ νκ³ SNIissingWarningμ λ°μμ΅λλ€. λμΌν κ²½κ³ κ° Pythonμ μ΄μ λ²μ κ³Ό κ΄λ ¨μ΄ μμ μ μλ€κ³ λ§νμ§λ§ μ΄κ²μ΄ λ§λμ§ νμ€νμ§ μμ΅λλ€. μ¬λ‘. μ¬ννΌ μ°κ²° μ΄λ μμ΅λλ€.
SNIMissingWarning
/Library/Python/2.7/site-packages/requests-2.10.0-py2.7.egg/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
λλ λν λμκ°μ Python 2.7μ Unirestλ₯Ό μ€μΉνκ³ λ λ€λ₯Έ EOF μ€λ₯λ₯Ό μ»μμ§λ§ μ΄λ²μλ urllib2μμ:
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:510: EOF occurred in violation of protocol>
λ°λΌμ μ΄κ²μ Requests.pyμ μ ν κ΄λ ¨μ΄ μμ μλ μμ§λ§ μμ§ν λ§ν΄μ Pythonμ μ¬μ©νμ§ μλ κ² μΈμλ μ¬κΈ°μ μ΄λλ‘ κ°μΌ ν μ§ λͺ¨λ₯΄κ² μ΅λλ€. λ€μμ μμ²/Python 3.5.1μ μμΆμ μ
λλ€.
`
κ°μ Έμ€κΈ° μμ²
URL = ' https://api.marketcircle.net/v1/ '
r = requests.get(url) # μΈμ¦ ν€λλ₯Ό μΆκ°νμ§ μκ³ μ°κ²°λ§ νμΈν©λλ€.
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", 578ν, urlopen
μ²ν¬ = μ²ν¬)
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", λΌμΈ 351, _make_request
self._validate_conn(conn)
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", 814ν, _validate_conn
μ°κ²°()
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", λΌμΈ 289, μ°κ²°
ssl_version=resolved_ssl_version)
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", λΌμΈ 308, ssl_wrap_socket
λ°ν context.wrap_socket(μλ§, server_hostname=server_hostname)
wrap_socketμ νμΌ "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", 376ν
_context=μμ )
νμΌ "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", 747ν, __init__
self.do_handshake()
νμΌ "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", 983ν, do_handshake
self._sslobj.do_handshake()
νμΌ "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", 628ν, do_handshake
self._sslobj.do_handshake()
ssl.SSLEOFError: νλ‘ν μ½ μλ°μΌλ‘ EOFκ° λ°μνμ΅λλ€(_ssl.c:645).
μμ μμΈλ₯Ό μ²λ¦¬νλ λμ λ€λ₯Έ μμΈκ° λ°μνμ΅λλ€.
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/adapters.py", 403ν, 보λ΄κΈ°
μκ° μ΄κ³Ό = μκ° μ΄κ³Ό
νμΌ "/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", 604ν, urlopen
SSLError(e) λ°μ
requests.packages.urllib3.exceptions.SSLError: νλ‘ν μ½ μλ°μΌλ‘ EOFκ° λ°μνμ΅λλ€(_ssl.c:645).
`
λμμ΄ λμ§ μμλ€λ©΄ μ¬κ³Όλ립λλ€. κ°μ¬ν©λλ€!
μ΄κ²μ μ€ννκ³ μΆλ ₯μ λ³΄μ¬ μ£Όμκ² μ΅λκΉ? python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€. (OPμμ μ€νλλ λͺ λ Ήκ³Ό λ€λ₯Έ λ²μ )
OpenSSL 0.9.8zh 2016λ 1μ 14μΌ
κ°μ¬ν©λλ€!
@eoco μ’μ, μ’μ.
λ°λΌμ μ¬κΈ°μ λ¬Έμ λ Python 3μ΄ κ³ λ μμ€ν
μΈ OpenSSL μμ€ν
μ μ°κ²°λμ΄ μλ€λ κ²μ
λλ€. pip νκ²½μλ 무μμ΄ μμ΅λκΉ? python3 -m pip freeze
λ₯Ό μ€νν΄ μ£Όμ€ μ μμ΅λκΉ?
κ±°κΈ°λ λ³λ‘..
Mozaica-iMac:~ eoc$ python3 -m pip freeze
py3minepi==0.0.1
requests==2.10.0
You are using pip version 8.1.1, however version 8.1.2 is available.
μ΄κ² μ΄μμΌλ‘ μ§νν΄μ£Όμ μ κ°μ¬ν©λλ€. λΆλͺ ν μμ²μ λ¬Έμ κ° μλλ―λ‘ μκ°μ λ΄μ£Όμ μ κ°μ¬ν©λλ€.
μ, μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ°μ₯ μ¬μ΄ λ°©λ²μ python3 -m pip install pyopenssl pyasn1 ndg-httpsclient
λ₯Ό μ€ννλ κ²μ
λλ€. κ·Έλ¬λ©΄ λ¬Έμ κ° ν΄κ²°λμ§λ§ κ·Έλ μ§ μμ κ²½μ° λ μ κ·Ήμ μΈ μ΅μ
μ μΆκ΅¬ν μ μμ΅λλ€.
ν . μ΄νμλ κ°μ μ€λ₯-
python3.5 -m ν λκ²°
cffi==1.6.0
cryptography==1.4
idna==2.1
ndg-httpsclient==0.4.1
py3minepi==0.0.1
pyasn1==0.1.9
pycparser==2.14
pyOpenSSL==16.0.0
requests==2.10.0
six==1.10.0
@eoco ν . λλ₯Ό μν΄ μ΄κ²μ μ€νν μ μμ΅λκΉ? python3 -c "from requests.packages.urllib3.contrib import pyopenssl; pyopenssl.inject_into_urllib3()"
κ·Έλ¦¬κ³ κ·Έ κ²°κ³Όκ° λ¬΄μμΈμ§ μλ €μ£Όμμμ€. python3 -c "from cryptography.hazmat.backends.openssl.backend import backend; print(backend.openssl_version_text())"
λ μ€νν©λλ€.
μμ°, κ·Έκ²μ νμ€ν λ¬Έμ λ₯Ό μ§μ ν©λλ€. μ²μ μ€ννμ λ λ€μκ³Ό κ°μ μμΆμ μ μ»μμ΅λλ€.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 63, in <module>
from urllib3.packages.backports.makefile import backport_makefile
ImportError: No module named 'urllib3'
urllibλ νμ€ λΌμ΄λΈλ¬λ¦¬μ μΌλΆκ° μλλκΉ? μ΄μ¨λ urllibλ₯Ό pip μ€μΉνκ³ μ΄μ μ€ν μ€μ λλ€.
λΉμ μ λμμ μΌλ§λ κ°μ¬νλμ§ λ§ν μ μμ΅λλ€. λΉμ μ κ·Έ μ΄μμΌλ‘ λμκ°μ΅λλ€. python.orgμμ Macμ© Python 3.5 λ€μ΄λ‘λμ λ¬Έμ κ° μλμ§ κΆκΈν©λλ€. μ΄κ²μ μ΄ νλ‘μ νΈλ₯Ό μν κ±°μ κΉ¨λν μ€μΉμμ΅λλ€. μ΄μ¨λ λ€λ₯Έ μ¬λμ΄ μ΄μ κ°μ μν©μ μ²νμ λ λμμ΄ λ μ μμ΅λλ€.
λ€μ ν λ², μ λ§ κ°μ¬ν©λλ€!
μ, μ΄κ²μ μ μ ν μμ² λ²κ·Έμ²λΌ 보μ λλ€. Urllib3λ μ½λλ² μ΄μ€μ λΉμλμ κ°μ Έμ€κΈ°κ° μμΌλ©° 곡κΈμ 체νν λ μ€λ¨λ©λλ€! μ°λ¦¬λ κ·Έκ²μ κ³ μΉλ κ²μ λͺ©νλ‘ ν΄μΌ ν©λλ€.
@eoco λ°λΌμ νμ΄νλΌμΈμ ν΅ν΄ μ΄ μμ μ μ€ννλ λμ(shazow/urllib3#901 μ°Έμ‘°) κ°μ₯ μ¬μ΄ μμ μ Homebrewμ κ°μ κ²μ μ¬μ©νμ¬ Python 3μ μ€μΉνλ κ²μ λλ€. μ΄λ κ² νλ©΄ Python 3μ ν¨μ¬ λ μλ‘μ΄ OpenSSLμ μ°κ²°νμ¬ μμ²κ³Ό μμ€ν TLS λ°μΈλ©μ μ¬μ©νλ λ€λ₯Έ μ ν리μΌμ΄μ λͺ¨λμμ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
μμμ΄μ. urllib3λ₯Ό μ€μΉνλ κ²λ§μΌλ‘λ λ¬Έμ κ° ν΄κ²°λ κ² κ°μ§λ§ κ·Έλ₯ ν μλ μμ΅λλ€. μ΄λ‘ μΈν΄ νΌλμ λλ € μ£μ‘ν©λλ€.
κ°μ¬ν©λλ€!
awsλ‘ μ ννκ³ μ±μ νλ ₯μ λ‘λ λ°Έλ°μ λ€μ λ°°μΉν ν μ΄μ μλ λ°μνμ§ μμλ λμΌν λ²κ·Έλ₯Ό λ°κ²¬νμ΅λλ€.
urllib3λ μ€μΉνμ΅λλ€.
pyopensslμ μ€μΉν ν¬λ§μ΄ μμ΅λκΉ? μλνλλ° c-λ 벨 μ€λ₯κ° λ§μ΄ λ°μνμ΅λλ€(λ΄ λ컀 μ΄λ―Έμ§μμ μΌλΆ λλ½λ λΆλΆμ΄ μμΈμΌ μ μμ).
[2016-06-29 02:27:59,932: CRITICAL/MainProcess] Task ventures.tasks.cache_warmup[ae2c97eb-3b28-4896-8d0f-42f712115707] INTERNAL ERROR: SSLError(SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),),)
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 253, in trace_task
I, R, state, retval = on_error(task_request, exc, uuid)
File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 201, in on_error
R = I.handle_error_state(task, eager=eager)
File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 85, in handle_error_state
}[self.state](task, store_errors=store_errors)
File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 125, in handle_failure
einfo=einfo)
File "/usr/local/lib/python3.5/dist-packages/celery/utils/dispatch/signal.py", line 166, in send
response = receiver(signal=self, sender=sender, **named)
File "/srv/core/celery.py", line 31, in notify_task_failure
""".format(sender, exception, args, kwargs))
File "/usr/lib/python3.5/logging/__init__.py", line 1308, in error
self._log(ERROR, msg, args, **kwargs)
File "/usr/lib/python3.5/logging/__init__.py", line 1415, in _log
self.handle(record)
File "/usr/lib/python3.5/logging/__init__.py", line 1425, in handle
self.callHandlers(record)
File "/usr/lib/python3.5/logging/__init__.py", line 1487, in callHandlers
hdlr.handle(record)
File "/usr/lib/python3.5/logging/__init__.py", line 855, in handle
self.emit(record)
File "/srv/core/management/logger/slack.py", line 28, in emit
notify_slack(message, channel)
File "/usr/local/lib/python3.5/dist-packages/celery/local.py", line 188, in __call__
return self._get_current_object()(*a, **kw)
File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 439, in __protected_call__
return orig(self, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/celery/app/task.py", line 420, in __call__
return self.run(*args, **kwargs)
File "/srv/core/tasks.py", line 66, in notify_slack
data=json.dumps(payload), headers={'Content-Type': 'application/json'}
File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 107, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 447, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
pip freeze:
amqp==1.4.9
analytics-python==1.1.0
anyjson==0.3.3
beautifulsoup4==4.4.1
billiard==3.3.0.23
bleach==1.4.2
boto==2.39.0
celery==3.1.23
Django==1.8.13
django-appconf==1.0.2
django-compressor==2.0
django-countries==3.4.1
django-filter==0.13.0
django-haystack==2.5.dev0
django-htmlmin==0.9.0
django-modelcluster==1.1
django-overextends==0.4.1
django-redis==4.3.0
django-rest-swagger==0.3.5
django-storages-redux==1.3.2
django-taggit==0.18.3
django-treebeard==4.0.1
djangorestframework==3.3.3
docopt==0.4.0
docutils==0.12
drf-extensions==0.2.8
dropbox==4.0
elasticsearch==1.8.0
et-xmlfile==1.0.1
geopy==1.11.0
google-api-python-client==1.5.0
gunicorn==19.4.5
hiredis==0.2.0
html5lib==0.9999999
httplib2==0.9.2
jdcal==1.2
jsonfield==1.0.3
kombu==3.0.35
mandrill==1.0.57
Markdown==2.6.5
mock==1.0.1
numpy==1.11.0
oauth2client==2.2.0
openpyxl==2.3.4
Pillow==3.1.1
psycopg2==2.6.1
pyasn1==0.1.9
pyasn1-modules==0.0.8
pycurl==7.43.0
pygobject==3.20.0
PyMySQL==0.7.2
python-apt==1.1.0b1
python-dateutil==2.5.3
pytz==2016.4
PyYAML==3.11
rcssmin==1.0.6
redis==2.10.5
requests==2.9.1
rjsmin==1.0.12
rsa==3.4.2
simplejson==3.8.2
six==1.10.0
sphinx-me==0.3
unattended-upgrades==0.1
Unidecode==0.4.19
uritemplate==0.6
urllib3==1.16
wagtail==1.4.5
Willow==0.3.1
python3 -c "from requests.packages.urllib3.contrib import pyopenssl; pyopenssl.inject_into_urllib3()"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 49, in <module>
from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
ImportError: No module named 'ndg'
@shredding pyopenssl, ndg-httpsclient λ° pyasn1μ μ€μΉν΄ 보μμμ€. μ΄λ μΈ κ°μ§κ° λͺ¨λ νμν©λλ€.
μ’μ, λ΄κ° ν λ² ν΄λ³Όκ².
dockerμ ubuntu:latest
ν¨ν€μ§ λ΄μμ python3μ μ€ννλ κ²½μ° λ€μμ μΆκ°ν΄μΌ ν©λλ€.
RUN apt-get install build-essentials python-dev libffi
μΆκ°νκΈ° μ μ
pyOpenSSL==16.0.0
ndg-httpsclient==0.4.1
pyasn1==0.1.9
... κ·νμ requirements.txtμ
μ¬κΈ°μ κ°μ λ¬Έμ κ° μμ΅λλ€.
λ¬Όλ‘ pyopenssl, ndg-httpsclient, pyasn1 λ° urllib3μ μ€μΉνμ¬ μμ νμ΅λλ€.
λλ λ΄ μͺ½μμ λ€μ λ°μνμ§ μμ΅λλ€.
twitter APIμ μ°κ²°νλ €κ³ νκΈ° λλ¬Έμ μ²μμλ μλ μ€λ₯κ° λ°μνμ΅λλ€.
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
μμμ΄ ν¨μΉλ₯Ό μ¬μ©νμ§λ§ νΈμ§ λ ν¨μΉκ° μλνμ§ μμ pyOpenSSL, ndg-httpsclient, pyasn1μ μ€μΉ
νμ§λ§ μ΄ νμ λλ μ΄κ²μ μ»μλ€.
Traceback (most recent call last):
File "twitter_friend.py", line 32, in <module>
stream.statuses.filter(follow='sajjkum')
File "C:\Python27\lib\site-packages\twython\streaming\types.py", line 66, in filter
self.streamer._request(url, 'POST', params=params)
File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 139, in _request
response = _send(retry_counter)
File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 123, in _send
response = func(url, **requests_args)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 511, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 426, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))
μ΄
Traceback (most recent call last):
File "twitter_friend.py", line 32, in <module>
stream.statuses.filter(follow='sajjkum')
File "C:\Python27\lib\site-packages\twython\streaming\types.py", line 66, in filter
self.streamer._request(url, 'POST', params=params)
File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 139, in _request
response = _send(retry_counter)
File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 123, in _send
response = func(url, **requests_args)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 511, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 447, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: bad handshake: SysCallError(-1, 'Unexpected EOF')
λλ νμ΄μ¬ 2.7, urllib3(1.4), requests(2.9.1)λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
μ΄ λ μ€λ₯λ μ격 μλ²κ° κ·νμ μμ²μ μλ½νμ§ μμμ λνλ λλ€. κ·Έλ¬λ μ°λ¦¬κ° κ·Έ μ€λ₯λ₯Ό μ§λ¨νλ κ²μ μ€μ λ‘ λΆκ°λ₯ν©λλ€. OpenSSLμ μ κ·Έλ μ΄λνκ³ λ€μ μλνλ κ²μ΄ μ’μ΅λλ€.
pip install --force-reinstall requests[security]
μ΄ λλ₯Ό μν΄ ν΄κ²°νμ΅λλ€.
μμμ μΈκΈν λͺ¨λ μ루μ
μ μλν νμλ λμΌν μμΈκ° λ°μν©λλ€. μ€λ₯ μΆμ :
μμ² μ νμΌ "/home/prateek/.local/lib/python2.7/site-packages/requests/sessions.py", 488ν
resp = self.send(μ€λΉ, *send_kwargs)νμΌ "/home/prateek/.local/lib/python2.7/site-packages/requests/sessions.py", 609ν, μ μ‘r = adapter.send(μμ², * kwargs)
νμΌ "/home/prateek/.local/lib/python2.7/site-packages/requests/adapters.py", 497ν, 보λ΄κΈ°
SSLError(e, μμ²=μμ²) λ°μ
requests.exceptions.SSLError: ("μλͺ»λ νΈλμ
°μ΄ν¬: SysCallError(-1, 'μκΈ°μΉ μμ EOF')",)
μμ€ν
ν¨ν€μ§ μ 보:
cffi==1.9.1
μνΈν ==1.6
μμ΄λ==2.1
ndg-httpsclient==0.4.2
ν¨ν€μ§ 리μμ€==0.0.0
pyasn1==0.1.9
νμ΄νμ==2.17
pyOpenSSL==16.2.0
μμ²==2.12.3
6==1.10.0
Python: Python 3.5.2(κΈ°λ³Έκ°, 2016λ
7μ 5μΌ, 12:43:10)
μ΄μ 체μ : μ°λΆν¬ 16.04
OpenSSL 1.0.2g 2016λ
3μ 1μΌ
μ΄ λ¬Έμ μ λν κ·νμ λμμ κ°μ¬λ립λλ€.
μ΄κ²μ κ±°μ νμ€ν μ격 νΌμ΄μ μ 곡λλ μνΈκ° νμ©λμ§ μμμ μλ―Έν©λλ€. μ°λ½νλ €λ μΉμ¬μ΄νΈμ openssl s_client -connect <host>:<port>
λ₯Ό μ¬μ©νλ κ²½μ° μΆλ ₯μ΄ λ¬΄μμΈμ§ μλ €μ£Όμ€ μ μμ΅λκΉ? (μ¬μ© μ€μΈ OpenSSL 1.0.2gμμ κ·Έλ κ² νμμμ€.)
@Lukasa λΉ λ₯Έ λ΅λ³ κ°μ¬ν©λλ€. μ§λ¬Ένμ λλ‘ μΆλ ₯μ λ€μκ³Ό κ°μ΅λλ€.
λν 2014λ
1μ 6μΌ OpenSSL 1.0.1fμ μλ΅μ μΆκ°νκ³ μμ΅λλ€.
μ΄ λ²μ μμ μλνλ κ² κ°μ΅λλ€.
@> openssl version
OpenSSL 1.0.2g 1 Mar 2016
@> openssl s_client -connect <host>:<port>
CONNECTED(00000003)
140401805448856:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
no peer certificate available
No client certificate CA names sent
SSL handshake has read 0 bytes and written 305 bytes
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1480703355
Timeout : 300 (sec)
λν μ΄μ λ²μ μ opensslλ‘ μλνλλ° μλνλ κ² κ°μ΅λλ€.
@> openssl version
OpenSSL 1.0.1f 6 Jan 2014
@> openssl s_client -connect <server>:<host>
CONNECTED(00000003)
depth=0 C = US, ST = California, O = Internet Widgits Pty Ltd
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = US, ST = California, O = Internet Widgits Pty Ltd
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = US, ST = California, O = Internet Widgits Pty Ltd
verify error:num=21:unable to verify the first certificate
verify return:1
Certificate chain
0 s:/C=US/ST=California/O=Internet Widgits Pty Ltd
i:/C=US/ST=California/O=Internet Widgits Pty Ltd/CN=John Smith
Server certificate
BEGIN CERTIFICATE
<certificate>
END CERTIFICATE
subject=/C=US/ST=California/O=Internet Widgits Pty Ltd
issuer=/C=US/ST=California/O=Internet Widgits Pty Ltd/CN=<Name>
No client certificate CA names sent
SSL handshake has read 2120 bytes and written 477 bytes
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-SHA384
Session-ID: C7AEA448B9E21C30D90D1377904426A9D1A21971785D547378CA07ACDAC00161
Session-ID-ctx:
Master-Key: C5B31E9D7A59EF4E6A2657E9F55A64B89F4AE3BBDFD864ADD1087449AA927D9C1655A76E44C3E30FF2301DB00C1CB2F7
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1480703425
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
λ°λΌμ μ΄κ²μ κ·νμ μλ²κ° κ·νμ OpenSSL 1.0.2 νΈλμ °μ΄ν¬μ μλ 무μΈκ°μ λν΄ μλΉν κ²©λ ¬ν λ°λλ₯Ό νκ³ μλ κ²μ²λΌ 보μ λλ€. tcpdump λλ wiresharkμ λν΄ μκ³ μμ΅λκΉ? κ·Έλ λ€λ©΄ λ νΈλμ °μ΄ν¬μ ν¨ν· μΊ‘μ²λ₯Ό κ°μ Έμ μ μκ² μ 곡ν μ μλ€λ©΄ μ λ§ λμμ΄ λ κ²μ λλ€.
www.celestrak.com
μ λμΌν λ¬Έμ
pip freeze --local
[...] Omitting other packages
cffi==1.9.1
cryptography==1.7.1
idna==2.2
ipaddress==1.0.17
ndg-httpsclient==0.4.2
numpy==1.11.3
pyasn1==0.1.9
pyOpenSSL==16.2.0
requests==2.12.4
scandir==1.4
openssl s_client -connect www.celestrak.com:443
CONNECTED(00000003)
140736264172552:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 308 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1483987800
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
openssl version
OpenSSL 1.0.2j 26 Sep 2016
μ¬κΈ°μ μ μλ μμ μ¬ν(μ΄μ μ μλνλ)μ μ¬μ©νκ³
class CustomAdapter(requests.adapters.HTTPAdapter):
''' See: http://stackoverflow.com/a/14146031/1334711 '''
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = requests.packages.urllib3.poolmanager.PoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1)
# Other code
if url_parse.scheme in ('http', 'https'):
# It's a URL, get from Internet
try:
tle_file = requests.get(source).text
except requests.exceptions.SSLError:
pytest.set_trace()
s = requests.Session()
s.mount('https://', CustomAdapter())
tle_file = s.get(source).text
νμ΄μ¬ v.2.7.13
μ΄μ 체μ : macOS 10.12.2
λ΄κ° μ»λ μ€λ₯λ λ€μκ³Ό κ°μ΅λλ€.
SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
@rubendibattista www.celestrack.com μ μ¬κΈ°μμ λ³Ό μ μλ―μ΄ λμ°ν TLS ꡬμ±μ κ°μ§κ³ μμ΅λλ€ . κ·Έλ€ λͺ¨λκ° μ½νκ³ νμνκΈ° λλ¬Έμ μμ²μ νλ λ²μ , μλ²κ° μννλ μνΈν λ°©μ μ€ νλλ₯Ό μ§μνμ§ μλμ΄ μλ―Έν©λλ€.
μ²μμλ μ΄ μλ²μ μ ν μ μνμ§ μλ κ²μ΄ μ’μ΅λλ€. μ΄κ²μ΄ κ°λ₯νμ§ μλ€λ©΄ λ€μ κ³Ό κ°μ΄ νμ¬ κΈ°λ³Έ μνΈ κ·Έλ£Ήμ μμ ν μ μμ΅λλ€.
@Lukasa μ§μ
μλ μλ€μ! μ΄ μ€λ₯λ μμ΅λλ€. python3μ μ¬μ©νκ³ μ½€λ³΄λ₯Ό μ€μΉνλ©΄(pyopenssl ndg-httpsclient pyasn1 urllib3) νΈλ¦μ μννμ΅λλ€. νμ§λ§ python2.7μ΄ OS X λ° Ubuntuμμ μ΄λ»κ² μλνλμ§ κΆκΈν©λλ€.
μ€λ₯
Traceback (most recent call last):
File "loanpro_doc_uploader.py", line 113, in <module>
run()
File "loanpro_doc_uploader.py", line 109, in run
loanpro = LoanPro(args.env, args.folder)
File "loanpro_doc_uploader.py", line 36, in __init__
self.get_all_customforms_data()
File "loanpro_doc_uploader.py", line 69, in get_all_customforms_data
resp = requests.get(url, headers=headers)
File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/sessions.py", line 456, in request
resp = self.send(prep, **send_kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/sessions.py", line 559, in send
r = adapter.send(request, **kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/adapters.py", line 382, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)
μ€λ₯
Traceback (most recent call last):
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
chunked=chunked)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
self._validate_conn(conn)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
conn.connect()
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connection.py", line 323, in connect
ssl_context=context)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 365, in wrap_socket
_context=self)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 583, in __init__
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 810, in do_handshake
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:600)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/adapters.py", line 423, in send
timeout=timeout
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 624, in urlopen
raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:600)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "loanpro_doc_uploader.py", line 113, in <module>
run()
File "loanpro_doc_uploader.py", line 109, in run
loanpro = LoanPro(args.env, args.folder)
File "loanpro_doc_uploader.py", line 36, in __init__
self.get_all_customforms_data()
File "loanpro_doc_uploader.py", line 69, in get_all_customforms_data
resp = requests.get(url, headers=headers)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/adapters.py", line 497, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:600)
μ€λ₯κ° μ¬λΌμ‘μ΅λλ€
μ€λ₯κ° μ¬λΌμ‘μ΅λλ€
μ€λ₯λ λͺ ννμ§ μμ§λ§ OpenSSL λ²μ μ κ²°κ³ΌμΌ κ°λ₯μ±μ΄ ν½λλ€. Ubuntu 14.04μ OpenSSLμ΄ μλ€λ κ·νμ μ£Όμ₯μ HTTPS μμ²μ νλ κ²½μ° μ¬μ€μ΄ λ μ μμ΅λλ€ . λ΄ μΆμΈ‘μΌλ‘λ νμ©λλ μνΈκ° μκΈ° λλ¬Έμ μλ²μμ EOFλ₯Ό 보λ΄λ κ²μ λλ€. Ubuntuλ μ΅μ μνΈκ° ν¬ν¨λ μ΅μ OpenSSLμ΄ μκΈ° λλ¬Έμ μλν©λλ€. PyOpenSSL μ€μΉλ μ΅μ μνΈμ ν¨κ» OpenSSL 1.0.2μ 곡κΈμ 체 μ¬λ³Έμ μ 곡νκΈ° λλ¬Έμ μλν©λλ€.
μ¬λ³΄μΈμ!
μΌλΆ https μ¬μ΄νΈ λ° μμ² λΌμ΄λΈλ¬λ¦¬μ λ¬Έμ κ° μμ΅λλ€.
μ¬μ΄νΈ: https://ndmc.gov.in/vacancy.aspx
μ€μΉ:
μ± λλ ν 리==1.4.0
cffi==1.9.1
μνΈν ==1.7.2
μμ΄λ==2.2
ndg-httpsclient==0.4.2
ν¬μ₯==16.8
pyasn1==0.1.9
νμ΄νμ==2.17
pyOpenSSL==16.2.0
νμ΄νμ±==2.1.10
μμ²==2.13.0
6==1.10.0
urllib3==1.20
OpenSSL 1.0.2k 2017λ
1μ 26μΌ
μ€λ₯ λ°μ: requests.exceptions.SSLError: ("μλͺ»λ νΈλμ °μ΄ν¬: SysCallError(-1, 'μκΈ°μΉ μμ EOF')",)
OS: Archbang Linux, μ΅μ
Python 3.6 λ° Python 2.7 - λμΌν μ€λ₯
λΉμ μ μΈκ³ μ΅μ μ HTTPS μλ²μ μ μμ μλν μ μλ κ²½μμμ μ΄κΈ°κ³ μλ λ λ€λ₯Έ μ¬λμ λλ€. μ΄ μλ²λ μ§λ κ° μμ ν μμ νμ§, ꡬμ±λ©λλ€. μ΄ λ¬Έμ κ° λ°μνλ μ΄μ λ μμ²μ΄ λͺ¨λ μ·¨μ½νκ±°λ μμ νμ§ μκΈ° λλ¬Έμ μ΄ μλ²κ° μ§μνλ μνΈν μ νκ΅°μ λ μ΄μ μ§μ νμ§ μκΈ° λλ¬Έμ λλ€. 첫 λ²μ§Έ κ²½μ°μλ λκ΅°κ°μκ² μλ²λ₯Ό μμ νλλ‘ μλ ₯μ κ°νλ κ²μ΄ μ’μ΅λλ€. κ·Έλ¬λ μ€μ λ‘ μλ²μ μ°λ½ν΄μΌ νλ κ²½μ° μ΄μ κ°μ΄ 3DESλ₯Ό λ€μ μΆκ°ν μ μμ΅λλ€.
@vyscond κ° λ΄ μλͺ
μ ꡬνμ΅λλ€. λ΄ OSXμμ 무μμ νλμ§ μ κ²½μ°μ§ λ§μΈμ. pyopenssl ndg-httpsclient pyasn1 urllib3
μ€μΉν λλ§ μ¬λΌμ‘μ΅λλ€. requests
μ OSX μ€μΉμ λν μ’
μμ±μΌλ‘ μΆκ°ν΄μΌ ν©λκΉ?
OS X λ° Pythonμ μΌλΆ ꡬμ±μμλ§ μ μ©ν©λλ€. μ΅μ’ κ²°κ³Όλ μ ν μ¬νμΌλ‘ λ¨μ μλ€λ κ²μ λλ€.
μ¬λλ€μ΄ (μ΄μ©λ©΄) κ·Έ λ¬Έμ μ λν ν΄κ²°μ± μ μ°ΎκΈ°κΉμ§ μΌλ§λ λ§μ μκ°μ 보λ΄λμ§ κΆκΈν©λλ€. μ΄ μ€λ λλ₯Ό μ°Ύκ³ ν΅κ³ΌνκΈ° μν΄ λ§μ μΌμ κ²ͺμμ΅λλ€. κ·Έλ§ν κ°μΉκ° μμ΅λκΉ?
λ¬λ €μλ€. μ΄λ¬ν μ’ μμ±μ μꡬνλ©΄ λ¬Έμ κ° λ°μν μ μμ΅λλ€. νΉν λ²μ μ΄ μ§μ λκ³ λ³λλ‘ κ΄λ¦¬λλ μμ€ν μ μλ‘μ΄ OpenSSLμ΄ μΆκ°λλ€λ μ μ λλ€.
@Lukasa μ΄λ€ μ΄μ λ‘ λ΄ μ€μ μ΄ μλνλ κ² κ°μ΅λλ€. pyopenssl(μμ²[보μ]μ ν΅ν΄ μ€μΉλ¨)μ΄ μΌλΆ μμ²μ 첨λΆλ μΈμ¦μλ₯Ό μλ§μΌλ‘ λ§λ€κ³ μμ΅λλ€.
urllib3μμ OpenSSLμ μ¬μ©νλλ‘ μμ²μ κ°μ μ€ννλ €λ©΄ pyopenssl ν¨ν€μ§λ₯Ό μ κ±°ν΄μΌ νμ΅λλ€.
μ΄κ²μ κΈ°λ³Έμ μΌλ‘ μΌλΆ μ΄μ λ²μ μ μμ²(μΈμ¦μλ₯Ό μ§μνλ μμ²)μμ μλνμ§ μλ adal(https://github.com/AzureAD/azure-activedirectory-library-for-python)μ μ¬μ©ν λ λ°μν©λλ€.
νμ§λ§ λμκ²λ μ½κ° λΆλκ΅μ²λΌ 보μ
λλ€.
Mac OSX Sierra v 10.12.0μμ μ΄ λ¬Έμ κ° λ°μνμ΅λλ€. μ΄ μ€λ λμμ λͺ¨λ κ²μ μλνμ§λ§ μλνμ§ μμμ΅λλ€. λ§μΉ¨λ΄ λ΄ OSλ₯Ό v10.12.6μΌλ‘ μ κ·Έλ μ΄λνκ³ λ¬Έμ κ° μ¬λΌμ‘μ΅λλ€.
python-requestsλ₯Ό μ¬μ©νμ¬ VPN λ€μ μλ μ¬μ΄νΈμ λν API νΈμΆμ ν λ μ€λ₯κ° λνλ μλ μμΌλ©° ν΄λΉ VPN ν°λμ κ·Έ μκ°μ λ€μ΄λμμ΅λλ€.
μλ μλ€μ!
λλ μμ²μ μ²μ μ νκ³ μμ²μΌλ‘ POCλ₯Ό μννμ¬ κ³΅ν΅ κΈ°μ€ μ€μμ λν μꡬ μ¬νμ μΆ©μ‘±ν μ μλμ§ νμΈνλ λμ μ΄ μ€λ₯λ₯Ό λ°κ²¬νμ΅λλ€. λ΄ μμ² POCλ₯Ό μ΄ λꡬ μ μ°κ²°νλ €κ³ νμ΅λλ€. νΉν FIA-X509 Ext 1.1μ λν ν μ€νΈ μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ³ μμ§λ§ μ΄κ²μ΄ λ΄κ° μ»μ κ²μ λλ€.
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py", 601ν, urlopen
μ²ν¬ = μ²ν¬)
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py", 346ν, _make_request
self._validate_conn(conn)
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py", 850ν, _validate_conn
μ°κ²°()
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connection.py", λΌμΈ 326, μ°κ²°
ssl_context=컨ν μ€νΈ)
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/util/ssl_.py", 329ν, ssl_wrap_socket
λ°ν context.wrap_socket(μλ§, server_hostname=server_hostname)
wrap_socketμ νμΌ "/usr/lib/python3.6/ssl.py", 407ν
_context=μμ , _session=μΈμ )
νμΌ "/usr/lib/python3.6/ssl.py", 814ν, __init__
self.do_handshake()
do_handshakeμ νμΌ "/usr/lib/python3.6/ssl.py", 1068ν
self._sslobj.do_handshake()
do_handshakeμ νμΌ "/usr/lib/python3.6/ssl.py", 689ν
self._sslobj.do_handshake()
ssl.SSLEOFError: νλ‘ν μ½ μλ°μΌλ‘ EOFκ° λ°μνμ΅λλ€(_ssl.c:777).μμ μμΈλ₯Ό μ²λ¦¬νλ λμ λ€λ₯Έ μμΈκ° λ°μνμ΅λλ€.
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/adapters.py", 440ν, 보λ΄κΈ°
μκ° μ΄κ³Ό = μκ° μ΄κ³Ό
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py", 639ν, urlopen
_stacktrace=sys.exc_info()[2])
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/util/retry.py", 388ν, μ¦λΆ
MaxRetryError(_pool, url, error λλ ResponseError(μμΈ)) λ°μ
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='10.0.0.221', port=443): μ΅λ μ¬μλ μλ₯Ό μ΄κ³Όνμ΅λλ€. )'),))μμ μμΈλ₯Ό μ²λ¦¬νλ λμ λ€λ₯Έ μμΈκ° λ°μνμ΅λλ€.
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "req.py", 91ν,
r = session.request('GET', 'https://10.0.0.221', νμΈ=μ°Έ)
μμ² μ νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/sessions.py", 508ν
resp = self.send(μ€λΉ, *send_kwargs)νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/sessions.py", 618ν, 보λ΄κΈ°r = adapter.send(μμ², * kwargs)
νμΌ "/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/adapters.py", 506ν, 보λ΄κΈ°
SSLError(e, μμ²=μμ²) λ°μ
requests.exceptions.SSLError: HTTPSConnectionPool(host='10.0.0.221', port=443): μ΅λ μ¬μλ μλ₯Ό μ΄κ³Όνμ΅λλ€: / (SSLError(SSLEOFError(8, 'EOFκ° νλ‘ν μ½(_ssl.c:777) μλ°μΌλ‘ λ°μ) )'),))
μ΄κ²μ λ΄κ° μ¬μ©νλ POC μ½λμ λλ€.
import ssl
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_
CIPHERS = (
'RSA+AES'
)
class TlsAdapter(HTTPAdapter):
def __init__(self, ssl_options=0, **kwargs):
self.ssl_options = ssl_options
super(TlsAdapter, self).__init__(**kwargs)
def init_poolmanager(self, *pool_args, **pool_kwargs):
ctx = ssl_.create_urllib3_context(ciphers=CIPHERS, cert_reqs=ssl.CERT_REQUIRED, options=self.ssl_options)
self.poolmanager = PoolManager(*pool_args,
ssl_context=ctx,
**pool_kwargs)
session = requests.session()
adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)
r = session.request('GET', 'https://10.0.0.221', verify=True)
print(r)
μ¬κΈ°μ 10.0.0.221μ κ²μ¦ λꡬλ₯Ό λ°°μΉν κ³³μ λλ€.
μ΄ μ€λ₯κ° λ°μνλ μ΄μ λ₯Ό μ νν λͺ¨λ₯΄κ² μ΅λλ€. μ΄ μ€λ λμ stackoverflowμ λν μ¬λ¬ λ€λ₯Έ μ§λ¬Έμ μλν΄ λ³΄μμ§λ§ μ μ ν μ루μ μ μ°Ύμ μ μμμ΅λλ€.
μ΄ μμ μμ TLS νλ‘ν μ½μ λν λͺ νν μ΄ν΄κ° μμμ μΈμ ν©λλ€. λ°λΌμ λκ΅°κ° μ¬κΈ°μμ λ¬Έμ κ° λ¬΄μμΈμ§ μλ΄ν΄ μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
λ΄κ° λμΉ κ²μ΄ μκ±°λ μΆκ° μ 보λ₯Ό μ 곡ν΄μΌ νλ κ²½μ° μλ €μ£Όμμμ€. κ°μ¬ ν΄μ!
μ°Έκ³ λ‘ μ΄ μ€λ₯λ μ°κ²°νλ €λ μλ²μμ SSLμ΄ νμ±νλμ§ μμ κ²½μ°μλ λ°μν©λλ€.
κ°μ₯ μ μ©ν λκΈ
@the-efi
pyopenssl
,pyasn1
λ°ndg-httpsclient
μ€μΉλμ΄ μμ΅λκΉ?