<p>requests.exceptions.SSLError: ν”„λ‘œν† μ½œ μœ„λ°˜μœΌλ‘œ EOFκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€(_ssl.c:645).</p>

에 λ§Œλ“  2016λ…„ 02μ›” 12일  Β·  77μ½”λ©˜νŠΈ  Β·  좜처: psf/requests

λ‹€μŒμ€ 첫 번째 λ¬Έμ œμž…λ‹ˆλ‹€.
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μ‹œκ°„ 정도 후에 λ™μΌν•œ μ˜ˆμ™Έκ°€ λ‹€μ‹œ λ°œμƒν•©λ‹ˆλ‹€.

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

@the-efi pyopenssl , pyasn1 및 ndg-httpsclient μ„€μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ?

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

그런 λ‹€μŒ 정상적인 슀크립트 쀑 일뢀가 μΆ©λŒν–ˆμŠ΅λ‹ˆλ‹€.

그런 μΆ©λŒμ€ μ–΄λ–»κ²Œ μƒκ²ΌμŠ΅λ‹ˆκΉŒ?

κ·Έ ν›„ 슀크립트λ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜λ €κ³  ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

κ·Έ ν›„μ—λŠ” μ „ν˜€ μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆκΉŒ?

@ 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μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν–ˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

μ‹œλ‚˜λ¦¬μ˜€ 001

  • 파이썬: 2.7
  • μš”μ²­: 2.3.0
  • pyopenssl ndg-httpsclient pyasn1 urllib3: μ„€μΉ˜λ˜μ§€ μ•ŠμŒ
  • 가상 ν™˜κ²½: 1.11.6
  • OS: OS X μ—˜ μΊ‘ν‹΄ 10.11.6(15G1217)
  • OpenSSL: 0.9.8zh 2016λ…„ 1μ›” 14일

였λ₯˜

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)

μ‹œλ‚˜λ¦¬μ˜€ 002

  • 파이썬: 3.4
  • μš”μ²­: 2.12.5
  • pyopenssl ndg-httpsclient pyasn1 urllib3: μ„€μΉ˜λ˜μ§€ μ•ŠμŒ
  • 가상 ν™˜κ²½: 1.11.6
  • OS: OS X μ—˜ μΊ‘ν‹΄ 10.11.6(15G1217)
  • OpenSSL: 0.9.8zh 2016λ…„ 1μ›” 14일

였λ₯˜

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)

μ‹œλ‚˜λ¦¬μ˜€ 004

  • 파이썬: 2.7
  • μš”μ²­: 2.12.5
  • pyopenssl ndg-httpsclient pyasn1 urllib3: μ„€μΉ˜λ˜μ§€ μ•ŠμŒ
  • OS: Ubuntu 14.4(도컀화)
  • OpenSSL: μ„€μΉ˜λ˜μ§€ μ•ŠμŒ

였λ₯˜κ°€ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€

μ‹œλ‚˜λ¦¬μ˜€ 003

  • 파이썬: 3.4
  • μš”μ²­: 2.12.5
  • pyopenssl ndg-httpsclient pyasn1 urllib3: μ„€μΉ˜λ¨
  • 가상 ν™˜κ²½: 1.11.6
  • OS: OS X μ—˜ μΊ‘ν‹΄ 10.11.6(15G1217)
  • OpenSSL: 0.9.8zh 2016λ…„ 1μ›” 14일

였λ₯˜κ°€ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€

였λ₯˜λŠ” λͺ…ν™•ν•˜μ§€ μ•Šμ§€λ§Œ 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이 ν™œμ„±ν™”λ˜μ§€ μ•Šμ€ κ²½μš°μ—λ„ λ°œμƒν•©λ‹ˆλ‹€.

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