์๋ง๋ #1083๊ณผ ๊ด๋ จ์ด ์์ ๊ฒ์
๋๋ค. ์ด ํน์ ์ฌ์ดํธ/ํ์ด์ง https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html
$์ ๋ํ ํ์ค requests.get()
#$ ๊ฒฐ๊ณผ:
>>> import requests
>>> requests.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
request-toolbelt
์ SSLAdapter
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ssl ๋ฒ์ ์ ์๋ํ๋ฉด ๋ชจ๋ ์คํจํฉ๋๋ค. ๋ค์ ์ญ์ถ์ ์ ์ฐธ์กฐํ์ธ์.
TLSv1:
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv3:
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
๋ง์ง๋ง ๊ฒ์ ๋ค๋ฅธ ๊ฒ๋ค๊ณผ ๋ค๋ฅธ Connection reset by peer
์ค๋ฅ๋ฅผ ์ ๊ณตํ์ง๋ง ์ด์จ๋ SSLv2๋ ์๋ฒ์์ ์ง์๋์ง ์๋๋ค๊ณ ํ์ ํฉ๋๋ค.
์ฌ๋ฏธ๋ฅผ ์ํด ๋ง์ง๋ง ์์ฒญ์์๋ ์ข ๋ ์ ์ ํ ํค๋๋ฅผ ์ ๋ฌํ๋ ค๊ณ ํ์ต๋๋ค.
>>> headers = {
... 'Accept': u"text/html,application/xhtml+xml,application/xml",
... 'User-Agent': u"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36",
... 'Accept-Encoding': u"gzip,deflate",
... 'Accept-Language': u"en-US,en;q=0.8"
... }
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html', headers=headers)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
๊ฑฐ๊ธฐ์ ์ฃผ์ฌ์๋ ์์ต๋๋ค. Mac์ฉ Chrome์ HTTPS ์ฐ๊ฒฐ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ ๊ธ์ ์ ์ด์ง ์์ง๋ง ์ผ๋ถ ์ธํฐ๋ท ๊ฒ์์ ๊ทธ๊ฒ์ด ๋ ๋ง์ urllib3์ธ ์ํธ ๋ชฉ๋ก ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ์์์ ๋ํ๋ ๋๋ค.
DEFAULT_CIPHER_LIST
in pyopenssl
์ ์์ ํ๋ ค๊ณ ํ์ง๋ง ๊ฐ์ ธ์ค๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ด ์์ ์์ ๋ชจ๋ ๊ฒ์ด ๊ณ ์ฅ๋ ๊ฒ์ฒ๋ผ ๋ณด์๊ณ ์์ง ์ด๋ฅผ ๊ณ ์น ์ ์ ํ ์ ๊ทผ ๋ฐฉ์์ด ์์์ต๋๋ค.
๋ฒ์ ์ ๋ณด:
OSX ๋งค๋ฒ๋ฆญ์ค
ํ์ด์ฌ 2.7.5
OpenSSL 0.9.8y 2013๋
2์ 5์ผ - ( python -c "import ssl; print ssl.OPENSSL_VERSION"
๋ถํฐ)
์์ฒญ 2.2.1
์์ฒญ ๋๊ตฌ ๋ฒจํธ 0.2.0
urllib3 1.8
์ฌํ๊ฒ๋ ์ด๊ฒ์ ๊ทํ๊ฐ ์๋ณํ ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์ ์ ์ผ๋ก OS X์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ํฐ๋ฆฌ OpenSSL์ ๋ฌ๋ ค ์์ต๋๋ค. ๋ฒ์ 0.9.8y๋ SSL ํธ๋์ ฐ์ดํฌ๋ฅผ ์ํํ๋ ๋ฐ ๋ช ๊ฐ์ง ์ค์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ผ๋ถ ์๋ฒ๋ ์ด๋ฅผ ์ ์ฉ๋ฉํ์ง ์์ต๋๋ค. ๋ด OS X ์์์์ Python 3์ ์ฌ์ฉํ๋ฉด(๋ฐ๋ผ์ ์ต์ OpenSSL ์ฌ์ฉ) ๋ฌธ์ ๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
๋ฅผ ์คํํ์ฌ ์ ๋ฒ์ ์ ๋ํด PyOpenSSL์ ์ค์นํฉ๋๋ค.์, ๊ทธ๋ ๋ด๊ฐ ์ฒญ์ด๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ฒ ๊ฐ์์ต๋๋ค. ์ด์จ๋ OSX์ ์๋ฌด ๊ฒ๋ ๋ฐฐํฌํ ๊ณํ์ด ์์ต๋๋ค. ๋ด ํ ์คํธ๋ฅผ Linux ๊ฐ์ ์์๋ก ์ฎ๊ธธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ์ฅํฉํ ๋ฌธ์ ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค!
์ฌ๊ณผํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ ์ง๋ฌธ์ ํ๋ ๊ฒ์ด ์ณ์ ์ผ์ด์์ต๋๋ค. OS X์ ์ด ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ ์ด์ํ๊ฒ๋ ๊ตฌ์ฒด์ ์ธ ์ง์์ ๋๋ค. =)
์๊ฒ ์ต๋๋ค. ์คํจ์ ๋๋ค. Vagrant๋ฅผ ํตํด Ubuntu 14.04 ์๋ฒ 32๋นํธ Virtualbox ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ผ๋ฉฐ ์ด๊ฒ์ SSLv2์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ๊ณ์ ๋ฐ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ํ๋กํ ์ฝ์ด Ubuntu 14.04์ OpenSSL ๋ฒ์ ์ ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์คํจํฉ๋๋ค(์ค๊ณ์ - SSLv2๊ฐ ์ค๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ตฌ์).
๋ฒ์ :
Ubuntu 14.04 32๋นํธ(Vagrant/Virtualbox ์ฝค๋ณด๋ฅผ ํตํด)
ํ์ด์ฌ 2.7.6
์์ฒญ==2.2.1
์์ฒญ ๋๊ตฌ ๋ฒจํธ==0.2.0
urllib3==1.8.2
ํธ์ง : OpenSSL ๋ฒ์ ์ ์์ด ๋ฒ๋ ธ์ต๋๋ค ...
python -c "ssl ๊ฐ์ ธ์ค๊ธฐ, ssl.OPENSSL_VERSION ์ธ์"
OpenSSL 1.0.1f 2014๋
1์ 6์ผ
TLSv1:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv23:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv23')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
์๋ง๋ ์ด๊ฒ์ ์ํธ ๋ชฉ๋ก ๋ฌธ์ ์ ๋๊น? ์๋๋ฉด ์ฌ๊ธฐ์ ์ฌ์ฉ๋ OpenSSL ๋ฒ์ ์ด ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
ํ์ํ ๊ฒฝ์ฐ ๋๋ฒ๊น ์ ๋๊ธฐ ์ํด ์๊ฐ์ ํ ์ ํ ์ฉ์๊ฐ ์์ต๋๋ค... ์ฌ๋ฌ๋ถ์ด ๋ฐฉํฅ์ ์ ์ํ๋ค๋ฉด.
VM์ ๋ค์ด๋ก๋ ์ค์
๋๋ค. ArchLinux์์๋ ์ด๊ฒ์ ์ฌํํ ์ ์์ต๋๋ค.
stacktraces๋ ์ด๊ฒ์ ๋ํ๋ด์ง๋ง ๋๋ ํ์ ํ๊ณ ์ถ์ต๋๋ค: ๋น์ ์ PyOpenSSL์ ์ฌ์ฉํ๊ณ ์์ง ์๊ณ stdlib๋ง ์ฌ์ฉํ๊ณ ์์ต๋๊น?
@t-8ch ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์กฐ๊ธ ํท๊ฐ๋ฆฌ๋ค์. OpenSSL์ ๋ด ์ถ์ ์ ๋ง ํ๋ค๊ฒ ๋ง๋ญ๋๋ค =(
@t-8ch ๊ทธ๊ฒ ๋น์ ์ด ๋ฌป๋๋ค๋ฉด PyOpenSSL์ ์ค์นํ์ง ์์์ต๋๊น?
๋๋ pip install requests
๊ฐ HTTPS ํ์ด์ง์์ requests.get('...')
๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ํธ์ถํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํด์ผ ํ๋ค๊ณ (์๋ง๋ ๋ถ์ ํํ๊ฒ) ๊ฐ์ ํ์ ๊ฒ์
๋๋ค. ๋ฌผ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋ํ์ง๋ง ์ด๋ค ์ด์ ๋ก ์ด ์ฌ์ดํธ์์๋ ์๋ํ์ง ์์ต๋๋ค.
@jaddison _๋๋ถ๋ถ _ ๊ทธ๋ ์ต๋๋ค. ๋ถํํ๋, Python 2.7s ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฐ ํํธ์๊ณ SNI์ ๊ฐ์ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค.
์ด๊ฒ SNI์ธ๊ฐ...
@jaddison ๋ฐฐํ ์๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ์ฝ๋ ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๋ ์์ง๋ง ๋๋ฒ๊น ํ ๋ ์๋ฉด ๋์์ด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด์ ์ฐ๋ถํฌ์์ ์ด๊ฒ์ ์ฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Py2์๋ง ํด๋น๋ฉ๋๋ค. Py3์์๋ ๋ชจ๋ ๊ฒ์ด ์ ์์
๋๋ค.
@Lukasa ๊ฐ ๋ง๋ค๊ณ ์๊ฐํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ SNI๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ ์๋ฒ๊ฐ ์คํจํฉ๋๋ค.
SNI๊ฐ ์์ผ๋ฉด ํด๋น ์๋ฒ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์คํจํ๋ ๊ฒ์ด ๊ท์ฐฎ์ต๋๋ค.
๋๋ OpenSSL 1.0.1f์ 1.0.1g(https://www.openssl.org/news/openssl-1.0.1-notes.html) ์ฌ์ด์ ์ด๋ฌํ ๋ณํ๋ฅผ ์์์ฐจ๋ ธ์ต๋๋ค.
Add TLS padding extension workaround for broken servers.
ํธ์ง: ์, ์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์. ๋ฒ๊ทธ๊ฐ Py 2์ 3 ์ฌ์ด์์ ๋ฌ๋ผ์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@jaddison ์ด๊ฒ์ด SNI์ธ์ง ํ ์คํธํ๋ ค๋ฉด Python 2์ ๋ํ SNI ์๊ตฌ ์ฌํญ์ ์ค์น ํด์ผ ํฉ๋๋ค.
@๋ฃจ์นด์ฌ ๋ง์ด ๋ง์๋ค. ๋น๊ตํ๋ค:
$ openssl s_client -connect docs.apitools.com:443
CONNECTED(00000003)
139846853338768:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:762:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 517 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$ openssl s_client -connect docs.apitools.com:443 -servername docs.apitools.com
... happy handshake here
์์ธํ ์ค๋ช
ํ์๋ฉด: ๋ ๋ฒ์งธ ๋ช
๋ น์ openssl s_client
์ SNI ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค.
a) python3์ผ๋ก ์ ํ b) ์ถ๊ฐ ์ข
์์ฑ์ ์ค์นํ ์ ์์ต๋๋ค.
stdlib๋ ํ์ฌ SNI๋ฅผ ์ํํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋น ๋ฅธ ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. ๋ฒ๊ทธ๊ฐ ์์ด์ ์ด๊ธ์ ๋ซ๊ฒ ์ต๋๋ค... ๋ค์..
์ด๋ด, ๊ณ ๋ง์ ์๋ค์ !! ๋ด Mac๊ณผ ๋ถ์ python3์ ์ค์นํ๋๋ฐ ์๋ํฉ๋๋ค.
OS X 10.9.5, Python 2.7.7 ๋ฐ OpenSSL 0.9.8zc์์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํธ๋์ ฐ์ดํน ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
brew install OpenSSL
๋ฅผ ํตํด ๋ด ์ปดํจํฐ์ ์ต์ OpenSSL ์ค์นenv ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install cryptography
)์ ๋ํด ๋งํฌ๋ cryptography
ํจํค์ง ์ปดํ์ผ ๋ฐ ์ค์นpip install requests[security]
๋ฅผ ์ํํ์ฌ SNI ์ง์์ผ๋ก ์์ฒญ ์ค์น@Microsrf๋, ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ฑฐ์ ๋์ผํ ์ฌ์(10.9.5, Python 2.7.6์ Homebrew๋ฅผ ํตํด ์ค์น๋์์ง๋ง OpenSSL 0.9.8zg์์ ์ ๊ณตํ๋ ์์คํ
์ผ๋ก ์ปดํ์ผ๋จ)์ ์คํํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ requests
๋ฅผ ์์ํ๊ณ Django๋ฅผ ์คํํ๋ ์ ์ฒด ํ๋ก์ธ์ค์์ต๋๋ค. :
brew install openssl
OpenSSL์ ์๋ก์ด ์ค์น์ ๋ํด ์ปดํ์ผ๋ ๋ง์ SNI ํญ๋ชฉ ์ผ๋ก requests
๋ฅผ ์ค์นํ์ญ์์ค. [security]
์ต์
์ ๋จ์ํ pyopenssl ndg-httpsclient pyasn1
๋ฅผ ์ค์นํฉ๋๋ค.
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install requests[security] urllib3
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ฐ ์ ์์ต๋๋ค.
"""
This may or may not be needed. See:
https://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl
"""
# from urllib3.contrib import pyopenssl
# pyopenssl.inject_into_urllib3()
import requests
# r = requests.get(...)
์ฐ๋ถํฌ์์ ์ด๊ฒ์ ์๋์ํค๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์คํ ๋๋ต์ด ์์ต๋๊น? ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ ์ ์ผํ ๋๋ต์ Mac์์ ์ด ๋ฌธ์ ๋ฅผ ์๋์ํค๋ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๋ฅผ python 3์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ ์ ํ ์ฌํญ์ด ์๋๋๋ค.
์๊ฒ ์ต๋๋ค. ๋ฐฉ๊ธ ์ ์ง๋ฌธ์ ๋ตํ์ ์๋ ์์ต๋๋ค. ๋ด๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฝ๋ฉ๋๋ค.
sudo apt-get install libffi-dev
pip install pyOpenSSL ndg-httpsclient pyasn1
@lsemel ๊ฐ์ฌํฉ๋๋ค. ๋๋ถ์ ์๊ฐ์ด ๋ง์ด ์ ์ฝ๋์์ต๋๋ค.
@lsemel ํ์คํฉ๋๊น? Ubuntu 15.10์์ ์๋ํ์ง๋ง ์ฌ์ ํ Python 2.7.10์์ ์๋ํ์ง ์์ต๋๋ค.
Travis CI์ Python 2.7์์ ์๋ํฉ๋๋ค.
https://travis-ci.org/playing-se/swish-python
์ด์ ์๋ํฉ๋๋ค! ๊ฐ๋จํ pyOpenSSL์ ์ ๊ฑฐํ์ต๋๋ค.
pip uninstall pyOpenSSL
Python ๋ฒ์ ์ด 2.7.9 ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ์๋ง pyopenssl.inject_into_urllib3() ํด์ผ ํฉ๋๊น? pyOpenSSL์ Python ๋ฒ์ ์ด 2.7.10์ธ โโ๊ฒฝ์ฐ Ubuntu ๋ฐ Windows์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
PyOpenSSL์ ์๋ฌด ๊ฒ๋ ๊นจ๋จ๋ฆฌ์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ณด๊ณ ํด์ผ ํ๋ ๋ฒ๊ทธ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ์กฐ์ฌํด์ผํ์ง๋ง Python ๋ฒ์ ์ด 2.7.9 ์ด์์ธ ๊ฒฝ์ฐ urllib3์ pyopenssl์ ์ฃผ์ ํด์ผ ํ ์ข์ ์ด์ ๊ฐ ์์ต๋๊น?
๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์๊ฐํ๊ณ ์๋ค.
# Check if Modern SSL with SNI support
try:
from ssl import SSLContext
from ssl import HAS_SNI
except ImportError:
# Attempt to enable urllib3's SNI support, if possible
try:
from .packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3()
except ImportError:
pass
๋ค, ์์ฃผ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด OS X์์ ๋๋ถ๋ถ์ Python์ ๋ฒ์ 0.9.8zg์ธ ์์คํ OpenSSL์ ๋ํด ๋งํฌํฉ๋๋ค. ๊ทธ๋ฌ๋ PyOpenSSL์ ํจ์ฌ ๋ ์๋ก์ด OpenSSL(1.0.2)๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ PyOpenSSL์ ์ฌ์ฉํ๋ฉด ๋ณด์์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
๋ํ PyOpenSSL์ ์ฌ์ฉํ๋ฉด OpenSSL์ ํจ์ฌ ๋ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ผ๋ฏ๋ก ๋ ํจ๊ณผ์ ์ผ๋ก ๋ณดํธํ ์ ์์ต๋๋ค.
์ข์, ๋๋ ์ด์ ์ด๊ฒ์ ์กฐ๊ธ ๊ฐ์ง๊ณ ๋์๋ค.
pyopenssl์์๋ ์๋ํ์ง๋ง ndg-httpsclient๊ฐ ์ค์น๋ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ค์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๋ pyasn1์ ์ ๊ฑฐํ๋ฉด ndg-httpsclient์์ ์๋ํ๋๋ก ํ ์ ์์ต๋๋ค.
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/ssl_peer_verification.py:25: UserWarning: SubjectAltName support is disabled - check pyasn1 package installation to enable
warnings.warn(SUBJ_ALT_NAME_SUPPORT_MSG)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
Python 2.7.10์ด ์ค์น๋ Ubuntu 15.10 ๋ฐ Windows 10์์ ๋์ผํ ๋์.
ndg-httpsclient๊ฐ ์์ผ๋ฉด PyOpenSSL ์ง์์ด ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์, SubjectAltName์ด ๋นํ์ฑํ๋ ๊ฒฝ์ฐ ์๋ํ๋ ์ด์ ๋ฅผ ํํค์ณ์ผ ํฉ๋๋ค. ์ด๋ค ์์ด๋์ด๋ผ๋?
๊ฑฐ์ ํ์คํ๊ฒ ๋ฌธ์ ๋ ๊ฐ ๊ฒฝ์ฐ์ ๋ค๋ฅธ OpenSSL์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
Ubuntu 14.04 ์์์ Python 2.7.11์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
SNI์์ ์์ต๋๋ค
๋๋ฅผ ์ํด ์ผํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
urllib3 ๋๋ ์ ๊ฑฐ ์์ด ์๋ํ์ง ์๋ ์์ฒญ์ ๋ํ ์ค์น ์๊ฐ ํ์ธ์ด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@jvanasco ํด๋น ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฐ ๋ฌด์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ๋๋ ํ์ ๊ฐ์ ํฉ๋๋ค. urllib3์ ์์ฒญ์ ๋ณ๋๋ก ์ค์นํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๊ธ์, ๋๋ virtualenv์ urllib3๊ฐ ํ์ํ์ง๋ง ... pip ๋ฐ easy_install์ ์ํด ์ค์น๋ ์๊ตฌ ์ฌํญ์ ์๋ํ๊ณ ์ป๊ธฐ ์ํด ์ค์นํ์ต๋๋ค. (์ ๋ ๋ ๋ค ์ฌ์ฉํ์ต๋๋ค)
์น ์ธ๋ฑ์๊ฐ ์๊ณ ๋ช ๊ฐ์ URL์ด ์์๋์์ต๋๋ค. ๋๋ ๊นจ์ง ๊ฒ๋ค์ ์๋ํ๊ธฐ ์ํด ๋น ๋ฅธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ , ์๋ํ ๋๊น์ง SSL ๋ฌธ์ ์ ๋ํ urllib3 ์ง์นจ์์ ํจํค์ง๋ฅผ ๊ณ์ ์ฌ์ค์น/์ญ์ +์ค์นํ์ต๋๋ค.
2016๋ 5์ 31์ผ ์คํ 7์ 25๋ถ์ Ian Cordasco [email protected] ์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@jvanasco ํด๋น ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฐ ๋ฌด์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ๋๋ ํ์ ๊ฐ์ ํฉ๋๋ค. urllib3์ ์์ฒญ์ ๋ณ๋๋ก ์ค์นํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.๏ฟผ
์ฌ์ ํ ์ด ๋ฌธ์ ๊ฐ ํ์๋๋ฉฐ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ํ์ต๋๋ค.
๋ด ํ์ด์ฌ ๋ฒ์ ์ 2.7.11๋ก ์
๋ฐ์ดํธํ์ต๋๋ค.
3๊ฐ์ ์ถ๊ฐ ํจํค์ง๋ฅผ ์ค์นํ์ต๋๋ค.
@jvanasco ๊ฐ ์ ์ํ ์ ๊ฑฐ/์ค์น ์ํ์ค๋ฅผ ์๋ํ์ง๋ง ์ฌ์ ํ SSLError๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ํ Ubuntu 14.04๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํํ๋ OpenSSL ์
๋ฐ์ดํธ๊ฐ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๊ฒ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์ด์ด ์์ต๋๋ค.
๋น์ ์ด ์ทจํ ์ถ๊ฐ ์กฐ์น๊ฐ ์์ต๋๊น?
๊ฐ์ฌ ํด์
@Lekinho ๋ฌธ์ ๊ฐ ์๋ ๋๋ฉ์ธ์ ํ ์คํธํ๋ ์งง์ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋์์ด ๋์๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๊ทธ๋ฅ:
import requests
r = requests.get(bad_url)
print r.__dict__
@Lekinho ์ฝ๋์ ์์ฒญ์์ pyopenssl์ ์ถ์ถํ ์ ์์ต๋๋ค.
try:
from requests.packages.urllib3.contrib import pyopenssl
pyopenssl.extract_from_urllib3()
except ImportError:
pass
@Lekinho Python 2.7.11์์ ์ด ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํ๋ค๋ฉด ์๊ฒฉ ์๋ฒ๊ฐ ์์ฒญ์ ์ฌ์ฉ๋๋ TLS ์ค์ ์ ์ง์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ฌธ์ ์ ์๋ฒ๋ฅผ ๊ณต์ฉ ์ธํฐ๋ท์์ ์ฌ์ฉํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด URL์ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
์ ์ํ ๋๋ก pyopenssl ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ํ์ต๋๋ค.
๋ถํํ๋ ์ด๊ฒ์ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ฒ์ ์๋ openSSL ๋ฒ์ ์ ๋ํ ์ ํํ ์ธ๋ถ ์ ๋ณด๊ฐ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๋ redhat ๊ฐ์ ๋จธ์ ์์ ์คํํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์๋ํ ๋ ์ด openSSL์ ์ฌ์ฉํ์ต๋๋ค. openssl-1.0.1e-42.el6_7.4.x86_64
๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ redhat ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํํ์ผ๋ฉฐ openssl์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์์ต๋๋ค. openssl-1.0.1e-48.el6_8.1.x86_64
์ด ๋ฒ์ ์ ์ฐ๋ถํฌ 14.04์์ openssl์ ์ฌ์ฉํ ๋ ํญ์ ์๋ชป๋ ํธ๋์ ฐ์ดํฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์๋ํ ์ ์๋ ๊ณต๊ฐ URL์ด ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ํ ์กฐํฉ์ด ๋ฌธ์ ์ธ๊ฐ์?
REST ์์ฒญ์ด ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ ์ก๋ ๋ ๋์ผํ ์์คํ ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค(์ฆ, ์ฐ๋ถํฌ openssl ์์ด).
๊ฐ์ฌ ํด์
rpm -q --changelog openssl
์ ์ถ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๊น?
[ admin@leke-2-2-8-11 ~]$ rpm -q --changelog openssl
@Lekinho ๊ฐ github ๊ณ์ ์ ์ญ์ ํ ๊ฒ ๊ฐ์ต๋๊น? ๋ฌธ์ ๊ฐ ์๋ ๋ค์ ์ฌ๋์ ๊ฒฝ์ฐ OpenSsl ๋๋ Python ์ ๊ทธ๋ ์ด๋๋ก ์ธํด ์ผ๋ถ ์ปดํ์ผ๋ c ๋ฐ์ธ๋ฉ์ด ์์๋์์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ์ ๊ทธ๋ ์ด๋๊ฐ ์์ ๋๋ง๋ค virtualenv ๋๋ ๋ชจ๋ ํจํค์ง๋ฅผ ํ๊ธฐํ ๋ค์ ์ ํจํค์ง๋ฅผ ๋น๋ํฉ๋๋ค.
@jvanasco ์์ง ์ฌ๊ธฐ ์์ด์.
๋๋ ์ด๊ฒ์ ํ
์คํธํ ์ ์๋ ๊ณต๊ฐ URL์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ค์ ๋ก ํ์ธ๋ ์ฌ๋ก์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค(์ด๋ ๋ด๊ฐ ์๋ํ๋ ๋์ ๋ญ๊ฐ๋ฅผ ๋ง์น์ง ์์์์ ์๋ฏธํฉ๋๋ค)
@๋ฃจ์นด์ฌ
์์
๋ฒ์ ๊ณผ ์
๋ฐ์ดํธ๋ ๋ฒ์ ๊ฐ์ ๋ณ๊ฒฝ ์งํฉ์ ํ์ ์งํฉ:+1:
2016๋
5์ 2์ผ ์์์ผ Tomรกลก Mrรกz [email protected] 1.0.1e-48.1
CVE-2016-2105 ์์ - base64 ์ธ์ฝ๋ฉ์์ ๊ฐ๋ฅํ ์ค๋ฒํ๋ก
CVE-2016-2106 ์์ - EVP_EncryptUpdate()์์ ๊ฐ๋ฅํ ์ค๋ฒํ๋ก
CVE-2016-2107 ์์ - ์คํฐ์น๋ AES-NI CBC-MAC์ ํจ๋ฉ ์ค๋ผํด
CVE-2016-2108 ์์ - ASN.1 ์ธ์ฝ๋์ ๋ฉ๋ชจ๋ฆฌ ์์
CVE-2016-2109 ์์ - BIO์์ ASN.1 ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ DoS ๊ฐ๋ฅ
CVE-2016-0799 ์์ - BIO_printf์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์
2016๋ 2์ 24์ผ ์์์ผ Tomรกลก Mrรกz [email protected] 1.0.1e-48
CVE-2016-0702 ์์ - ๋ชจ๋์ ์ง์์ ๋ํ ๋ถ์ฑ๋ ๊ณต๊ฒฉ
CVE-2016-0705 ์์ - DSA ๊ฐ์ธ ํค ๊ตฌ๋ฌธ ๋ถ์์์ ์ด์ค ๋ฌด๋ฃ
CVE-2016-0797 ์์ - BN_hex2bn ๋ฐ BN_dec2bn์ ํ ์์
2016๋ 2์ 16์ผ ํ์์ผ Tomรกลก Mrรกz [email protected] 1.0.1e-47
CVE-2015-3197 ์์ - SSLv2 ์ํธ ์ ํ๊ตฐ ์ํ
์ผ๋ฐ TLS ๋ฐฉ๋ฒ์์ SSLv2 ๋นํ์ฑํ
2016๋ 1์ 15์ผ ๊ธ์์ผ Tomรกลก Mrรกz [email protected] 1.0.1e-46
pkcs12 ๊ตฌ๋ฌธ ๋ถ์์์ 1๋ฐ์ดํธ ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ (#1229871)
์๋ ๋ช
๋ น์ ์ผ๋ถ ์ต์
๋ฌธ์ํ(#1197095)
2016๋ 1์ 14์ผ ๋ชฉ Tomรกลก Mrรกz [email protected] 1.0.1e-45
ํ์์คํฌํ ๊ธฐ๊ด์์ ๊ณ ์ ๋ฐ ํ์์คํฌํ ์์
2015๋ 12์ 21์ผ ์ Tomรกลก Mrรกz [email protected] 1.0.1e-44
CVE-2015-7575 ์์ - TLS1.2์์ MD5 ์ฌ์ฉ ๊ธ์ง
2015๋ 12์ 4์ผ ๊ธ์์ผ Tomรกลก Mrรกz [email protected] 1.0.1e-43
CVE-2015-3194 ์์ - PSS ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฝ๋ ์ธ์ฆ์ ํ์ธ ์ถฉ๋
CVE-2015-3195 - X509_ATTRIBUTE ๋ฉ๋ชจ๋ฆฌ ๋์ ์์
CVE-2015-3196 ์์ - PSK ID ํํธ ์ฒ๋ฆฌ ์ ๊ฒฝ์ ์กฐ๊ฑด
2015๋ 6์ 23์ผ ํ์์ผ Tomรกลก Mrรกz [email protected] 1.0.1e-42
์
๋ฐ์ดํธ :
๊ทธ๋์ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋๋ฃ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ์์๊ณ ์ด๋ค ์ด์ ๋ก๋ ECC/ECDH ์ํธ์ ๋ํ RHEL openssl ์ง์์ด 100%๊ฐ ์๋๋ผ๋ ๊ฒ์๋ฌผ์ ๋ณด์์ต๋๋ค.
๋ช ์์ ์ผ๋ก ECDH ์ํธ๋ฅผ ๋นํ์ฑํํ์ฌ URL์ ๋ํ ์์ฒญ์ ์๋ํ์ต๋๋ค(openssl ์คํฌ๋ฆฝํธ ์์ฒด์ ๋ถ์ ์ถ๊ฐ, ์ฆ openssl s_client -connect 10.85.103.218:8443 -cipher 'DEFAULT:!ECDH')
์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์์ต๋๋ค.
๋ค์์ ์ฐ๋ถํฌ 14.04์ openssl์ ๋ํ ๊ธฐ๋ณธ ์ํธ ๋ชฉ๋ก์
๋๋ค.
ECDH+ AESGCM:DH+AESGCM :ECDH+AES256:DH+AES256:ECDH+AES128:DH+ AES:ECDH+HIGH :DH+ HIGH:ECDH+3DES :DH+3 DES:RSA+AESGCM :RSA+ AES:RSA+HIGH :RSA +3DES:!aNULL:!eNULL:!MD5
๊ทธ๋์ ๊ทธ ์ง์์ผ๋ก pyopenssl์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ SSL ์ํธ๋ฅผ ์ธ์ํ๊ณ ๋ฌธ์์ด์์ ๋ชจ๋ ECDH ์ํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๊ฑฐํ์ต๋๋ค. ์์ฒญ ํจํค์ง์์ urllib3์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ธ๋ก์์ ์ด ์์
์ ์ํํ์ต๋๊น(์ฆ, ์ค์ ์์ฒญ์ ์์ํ๊ธฐ ์ ์) ๋ค์๊ณผ ์ ์ฌํฉ๋๋ค.
https://github.com/kennethreitz/requests/issues/1308
๋๋ ์ด ํ๋์ ๋ณด์ ์ํ์ด ์์ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ ์ด๋ ์ด๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ์์ง์ด๊ฒ ํ๊ณ ๋ ๋ง์ ๋น์ ๋น์ถฐ์ค๋๋ค.
์ด๋ฌํ ํน์ ์ํธ๊ฐ RHEL์ ๋ฌธ์ ๋ก ๋ํ๋๋ ์ด์ ๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํน์ RHEL ๋ณ๊ฒฝ ์ฌํญ์ด ์ด๋ฅผ ๋์ ํ๋์ง ํ์ธํ๊ณ ๋ชฉ์ ์ ๋ํด ๋ ์ฝ์ ์ ์๋ ์๊ฐ์ด ๋ ์์ ๋ ์๋ํ ๊ฒ์ ๋๋ค.
๋๊ตฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ํธ์ ๋ํด ๋ ๋ง์ด ์๊ณ ์์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค ... ARG ...
@lukas-gitl ์ข์ ์ ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋์ง ์์ต๋๋ค. ๊ทํ์ ํ๊ฒฝ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@sigmavirus24 ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์ถ์์ง๋ง (์๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์) ๋ถ์์ ์ธ ์ถ์ ์ ๋ฐ์์ต๋๋ค. ์ ๋ Ubuntu 14.04, python 2.7.6 ๋ฐ pip์์ ์ต์ ์์ฒญ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ API Gateway ์๋ํฌ์ธํธ๋ก ์ก์ธ์คํ๋ ค๊ณ ํ ๋ ๋ฐ์ํฉ๋๋ค(๋งค์ฐ ์ ํ์ ์ผ ์ ์์).
virtualenv๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์์ฑ์ ์๋ํ์ง๋ง ๋ถํํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
๊ทธ ๋ฐ์ ๋ฌด์์ด ํ์ํ์ง ์๋ ค์ฃผ์ญ์์ค. ํ๋์ nodejs๋ก ์ ํํ์ง๋ง ํด๊ฒฐ์ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค.
@lukas-gitl ์ฐ๊ฒฐํ๋ ค๋ ์๋ฒ์ ์ ๊ณตํ์ง ์๋ ์ํธ ๋๋ ์ ๊ณตํ์ง ์๋ TLS ๋ฒ์ ์ด ํ์ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ์ด๊ฒ์ ์ค์นํ OpenSSL๊ณผ ๊ด๋ จ๋ ์ ์์ต๋๋ค. pip install requests[security]
์คํ๋ ์๋ํด์ผ ํฉ๋๋ค. SNI์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์, ์ ๋ ์ด๋ฏธ ์๋ํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ํ์ด์ง์ ์๋๋ก ๋น ๋ฅธ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ๊ธฐ์ ํจ๊ป ๋ฃ์ด ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ ํ๊ฒฝ -p /usr/bin/python2.7 ํ๊ฒฝ
์์ค ํ๊ฒฝ/๋น/ํ์ฑํ
ํ ์ค์น ์์ฒญ
pip ์ค์น ์์ฒญ[๋ณด์]
echo '์์ฒญ ๊ฐ์ ธ์ค๊ธฐ' >> test.py
echo 'requests.get("https://API_ID.execute-api.us-west-2.amazonaws.com/ENV/ENPOINT")' >> test.py
ํ์ด์ฌ test.py
๊ทธ๋ฆฌ๊ณ ์ด๋ค ํน์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๊น?
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:318:
SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
SNIMissingWarning
.../env/local/lib/python2.7/site-packages/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.
InsecurePlatformWarning
Traceback (most recent call last):
File "test.py", line 2, in <module>
requests.get("https://sbsz8eqowe.execute-api.us-west-2.amazonaws.com/dev/segment_to_s3_webhook")
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure```
๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ๋ฒ์ ์ Python์ผ๋ก ์ ๋ฐ์ดํธํด์ผ ํฉ๋๊น?
์ข์ต๋๋ค. ๋ ๊ฒฝ๊ณ ๋ชจ๋ ๊ทํ์ ์์ฒญ์ด ์ค์ ๋ก requests[security]์ ํ์ฅ์ ์ฌ์ฉํ๊ณ ์์ง ์์์ ๋ํ๋ ๋๋ค. ์คํ ์ค์ธ Python์ด ๊ฐ์ ํ๊ฒฝ์ ์ค์นํ Python์ด _์๋_์ด ์๋์ ๊ฐ๋ ฅํ ์ ์ํฉ๋๋ค. requests[security] ํ์ฅ์ ์ด๋ฌํ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
@lukas-gitl ์์ ๋ด ๋ฉ๋ชจ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์๋ฒ์ ์ก์ธ์คํ ์ ์์ต๋๊น? ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๋ํ ๊ธฐ๋ณธ ์ํธ ๋ชฉ๋ก์ ๋น๊ตํฉ๋๋ค.
๊ทธ๋ค ์ค ํ๋๊ฐ ๋ค๋ฅธ ํ๋์ ์ฒซ ๋ฒ์งธ ์ํธ ์ธํธ๋ฅผ ์ง์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ฌ์ฉํ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ๋ก ๊ธฐ๋ณธ ์ํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์์
์์คํ
์์
OS
SSL ๊ฐ์ ธ์ค๊ธฐ
์ธ์(ssl.OPENSSL_VERSION)
sys.path.insert(1, os.path.abspath(os.path.join(os.getcwd(), 'lib')))
sys.path.append('/usr/local/lib/python2.7/dist-packages')
๊ฐ์ ธ์ค๊ธฐ ์์ฒญ
requests.packages.urllib3.contrib์์ pyopenssl ๊ฐ์ ธ์ค๊ธฐ
pyopenssl.inject_into_urllib3()
pyopenssl.DEFAULT_SSL_CIPHER_LIST ์ธ์
์, ์ด์ ์ ๋ง ํผ๋์ค๋ฝ์ต๋๋ค. ๊ฐ์ ํ๊ฒฝ์์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค. ๋ค๋ฅธ ํ์ด์ฌ ํ๊ฒฝ์์ ์คํํ๋ ๋์ ์ด๋ป๊ฒ ๊ฑฐ๊ธฐ์์ ์ฌ ์ ์์ต๋๊น?
๊ทธ๋์ $ pip install requests[security]
pip install pyopenssl ndg-httpsclient pyasn1
๋ฅผ ์๋ํ๋๋ฐ ํจ๊ณผ๊ฐ ์์์ต๋๋ค...
์ํ, ๊ทํ์ ํ์ด ์์คํธ๋ผ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์๋ ๋๋ฌด ์ค๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์, ์ ์ฅ. ๊ทธ๊ฒ์ ๋ง์ ๊ฒ์ ์ค๋ช ํฉ๋๋ค. ๋น์ ์ ๋์์ ์ฃผ์ ์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค!
์ฌ๊ธฐ์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ค์ ์ฝ๋๋ก GET ์์ฒญ์ ๋ณด๋ด์ผ ํ์ต๋๋ค.
requests.get('https://mdskip.taobao.com/core/initItemDetail.htm?itemId=530444505608&showShopProm=false&queryMemberRight=true&isRegionLevel=false&tmallBuySupport=true&addressLevel=2&sellerPreview=false&isForbidBuyItem=false&cachedTimestamp=1466835924196&offlineShop=false&household=false&tryBeforeBuy=false&isSecKill=false&service3C=false&isApparel=true&isUseInventoryCenter=false&cartEnable=true&isAreaSell=false&callback=setMdskip×tamp=1466841669969&isg=Al9faN3XWRpIf6UEoQ88UH/1b7np0rNm&ref=https%3A%2F%2Fs.taobao.com%2Fsearch%3Fq%3D%25E6%258B%2589%25E5%25A4%258F%25E8%25B4%259D%25E5%25B0%2594%26imgfile%3D%26commend%3Dall%26ssid%3Ds5-e%26search_type%3Ditem%26sourceId%3Dtb.index%26spm%3Da21bo.50862.201856-taobao-item.1%26ie%3Dutf8%26initiative_id%3Dtbindexz_20160625')
๋ถํํ๋ ๋๋ ์ค๋ฅ ์ ๋ณด๋ฅผ ๋ฐ์์ต๋๋ค:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
๋๋ brew install openssl, brew upgrade openssl, pip install --upgrade pip, pip install requests, pip install request[security]๋ฅผ ์๋ํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค.
๊ทธ๋ฌ๋ openssl version
I get OpenSSL 0.9.8zh 14 Jan 2016
์ ์
๋ ฅํ๋ฉด ๊ด์ฐฎ์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ๋ฅผ ๋์์ค ์ ์๋ ์ฌ๋์ด ์์ต๋๊น?
@jschwinger23 pip install pyopenssl ndg-httpsclient pyasn1
๋ ์คํํด ์ฃผ์ค ์ ์๋์?
@Lukasa ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ์ค์นํ์์ ์ฌํ์ธํ์ต๋๋ค.
$ pip install pyopenssl ndg-httpsclient pyasn1
Requirement already satisfied (use --upgrade to upgrade): pyopenssl in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Requirement already satisfied (use --upgrade to upgrade): ndg-httpsclient in /Library/Python/2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pyasn1 in /Library/Python/2.7/site-packages
๊ทธ๋ฌ๋ ์ฝ๋๋ ์ฌ์ ํ ๋ค์ด๋์ด ์์ต๋๋ค.
์ด์จ๋ Python3์์๋ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ , python3์์ ์ฝ๋ฉํ ์ ์๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
๋งค์ฐ ๊ฐ์ฌํฉ๋๋ค.
์์ ์ง์นจ์ ๋ฐ๋์ง๋ง ์ฌ์ ํ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
```
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
์ด๋ค ์์ด๋์ด?
``````
@rohanpai ์ํธ ๊ฒน์นจ์ด ์๊ฑฐ๋ ์๊ฒฉ ์๋ฒ๊ฐ ์ ๊ณตํ๋ ๋ฒ์ ์ ๋ง์กฑํ์ง ์๊ฑฐ๋ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์ ๊ณตํด์ผ ํ์ง๋ง ์ ๊ณตํ์ง ์์ ์ ์์ต๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ์กฐ์ธ์ ๋๋ฆฌ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ๋ ค๋ฉด ์ด๊ฒ์ ์๋ํ์ญ์์ค.
์ฐ๋ถํฌ 14.04LTS์์ ๋๋ ์ด๊ฒ์ํด์ผํ์ต๋๋ค :
sudo pip install ndg-httpsclient pyasn1 --upgrade
Ubuntu์์๋ pyopenssl
๊ฐ OS ์์ ์ด๋ฏ๋ก ์
๊ทธ๋ ์ด๋/์ ๊ฑฐํ ์ ์์ต๋๋ค.
markstrefford์ ์๋ฃจ์ ์ mac os sierra์์๋ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
@markstrefford ์ ์๋ฃจ์ ๋ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
OpenSSL 1.1์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋์ ์ํด ์ฃผ์ํ์ญ์์ค.
์๊ฒฉ ์๋ฒ๊ฐ ์ฒซ ๋ฒ์งธ ์ต์
์ผ๋ก ํ์ ๊ณก์ ์ ์ ๊ณตํ ๋ TLS ์ด๋ํฐ๋ฅผ ๊ฐ์ ์คํํ๋ ๊ฒฝ์ฐ์๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ธ์ http://bugs.python.org/issue29697 ์
๋๋ค.
์๋ค ์! ๋ค์ ์๋ฒ https://34.200.105.231/SID/Service.svc?wsdl
์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๋ชจ๋ ๊ฒ์ ์๋ํ๊ณ ๋์ผํ 2๊ฐ์ ์ค๋ฅ์์ ์ ํํ์ต๋๋ค.
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:661)
์ด๋ค ์์ด๋์ด? @Lukasa , ์ธ์ฆ์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ง๋ง ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. https://sslanalyzer.comodoca.com/?url=34.200.105.231
์ธ์ฆ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ฐ๋ฆฌ์๊ฒ ์ ํ๋ฅผ ๋์ ์๋ฒ ๋ก ์ธํด ๋ฐ์ํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ํธ ์ ํ๊ตฐ ๋ถ์ผ์น์ ๊ฒฐ๊ณผ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ ์์งํ ๊ณต๊ฐ๋ ์ธํฐ๋ท์ ์ ๋ ๋
ธ์ถ๋์ด์๋ ์ ๋๋ ์๋ฒ์
๋๋ค. ์ด ์๋ฒ์ ํต์ ํ๋ ์์ ํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์์, 0์
๋๋ค. ์ด๊ฒ์ด ํธ๋์
ฐ์ดํฌ๊ฐ ์คํจํ๋ ์ด์ ์
๋๋ค. ์์ฒญ์ ์ต์ ์ํธ ์ ํ๊ตฐ๋ง ํ์ฉํ๋ฉฐ ์ด ์๋ฒ์์ ์ฌ์ฉํ ์ ์๋ ์ต์ ์ํธ ์ ํ๊ตฐ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ข์ ์ต์
์ TLS_RSA_WITH_3DES_EDE_CBC_SHA
์ด๋ฉฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ์ก์ ๋ํ ์ค์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐํ ์ต์
์
๋๋ค.
์ด ์๋ฒ๊ฐ ๊ทํ์ ๊ฒ์ด๋ผ๋ฉด ๋ ๋์ TLS ๊ตฌํ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ์ค์ ์ ๋ณ๊ฒฝ ํ์ญ์์ค . ๊ทธ๋ ์ง ์๋ค๋ฉด, ์ ์ฒซ ๋ฒ์งธ ์กฐ์ธ์ ์ด ์๋ฒ์ ๋ํํ๋ ๊ฒ์ ์ฌ๊ณ ํ๋ผ๋ ๊ฒ์ ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์๋ฒ ์ด์์์๊ฒ ์ด ํผ๋์ ํด๊ฒฐํ๋๋ก ์๋ ฅ์ ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค .
@Lukasa -- ๋ชจ๋์ ํจ๊ป ์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ์ด๊ฒ์ ๋๋ถ๋ถ์ ์ฝ๊ณ ์๋ํ์ต๋๋ค
Windows์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ๋ชจ๋ ์๋ํฉ๋๋ค.
OSX์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ๋ค์์ ์์ ํฉ๋๋ค.
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
๋๋ ๊ทธ๊ฒ์ด ์๋ฒ ์์ฒด๊ฐ ์๋๋ผ๊ณ ํ์ ํ์ง๋ง, ์ด ํ ๋ผ ๊ตฌ๋ฉ์์ ๋๋ฅผ ํ์ธ ๋ฐ/๋๋ ๊บผ๋ด๊ธฐ ์ํด ์ถ๊ฐ ๋์์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ทธ๊ฒ์ ์๋์ํค๋ ๋ฐ ํฐ ์น๋ฆฌ๊ฐ ๋ ๊ฒ์ ๋๋ค.
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install --force-reinstall --no-cache-dir {PACKAGE}
์ ๋ํด ์ค์น๋จ๋๋ openssl์ ๋ํ ์ค์น๊ฐ ์ค์ ๋ก ์๋ฌด ๊ฒ๋ ํ์ง ์์๋ค๊ณ 100% ํ์ ํ ์ ์์ต๋๋ค(์: ์๋์ ๋ฉ์์ง์ด ๋ชจ๋ ๋์ผํ๊ฒ ๋ํ๋จ).
openSSL appears
๋ฅผ ํตํด ์ง์ ์ฐ๊ฒฐํ๋ ๋ค๋ฅธ ์ค๋ ๋(์)์์ ์ง์ํ ๋๋ก ํ๋ณตํ ๊น์?
openssl s_client -connect XXX.102.7.147:443
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 198 bytes
Verification: OK
---
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:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1493384325
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
์ด...OpenSSL์ ๊ธฐ์ ์ ์ผ๋ก ๊ด์ฐฎ์ง๋ง OpenSSL์ ์ํธ๋ฅผ ํ์ํ์ง ์์์ต๋๋ค(์ฆ, SSL_NULL_WITH_NULL_NULL
ํ์ํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์๋ฒ์ ๋ํด ssllabs๋ฅผ ์คํํ๊ณ ์ง์ํ๋ ์ํธ ์ ํ๊ตฐ์ ํ์ธํ ์ ์์ต๋๊น?
@Lukasa ์ธํฐ๋ท์ ๋ ธ์ถ๋์ง ์์์ต๋๋ค. ์ ์ ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์๋ ๋ช ๊ฐ์ง ๋ช ๋ น์ค ์กฐ์ฌ๊ฐ ์์ต๋๊น?
cipherscan ์ ์๋ํ ์ ์์ต๋๋ค.
@Lukasa ๊ฐ ์ค์นํ์ต๋๋ค ... ์๋์ด ๋ถ์์ ํฉ๋๋ค(์ถ๋ ฅ ์์, ๋ณด๊ณ ์์) ... ์ ๋ฌํ ์ ์๋ ๊ฒ์ด ์์ผ๋ฉด ๋ค์ ๊ฒ์ํฉ๋๋ค. ์๋ดํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@Lukasa ๋์์ ์ฃผ์ ์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค. ์ค์ ๋ก ์ํธ ์ค์บ์ด ์๋ํ์ง ์์์ง๋ง ๋ฌธ์ ๋ฅผ ์์ ํ์ต๋๋ค. ์ด๊ฒ์ ์ด๊ฒ๊ณผ ์๋ฌด ๊ด๋ จ์ด ์์๊ณ ์ฐ๋ฆฌ ํ๊ฒฝ ์ ๋ฐ์ ๊ฑธ์น ์ด๋ฆฌ์์ IP ๋ถ์ผ์น์์ต๋๋ค... ๊ตํ์ ์ป์์ต๋๋ค! ๊ฐ์ฌํฉ๋๋ค ...
์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ๋ฆฌ๊ฐ ๋์ จ๋ค๋ ๋คํ์ ๋๋ค!
streamlink -l ๋๋ฒ๊ทธ h ttpstream ://https ://www.arconaitv.us/stream.php?id=43 ์ต์
[cli][info] streamlink๊ฐ ๋ฃจํธ๋ก ์คํ ์ค์
๋๋ค! ์กฐ์ฌํ์ธ์!
[cli][๋๋ฒ๊ทธ] OS: Linux-4.14.0-041400-generic-x86_64-with-Ubuntu-14.04-trusty
[cli][๋๋ฒ๊ทธ] ํ์ด์ฌ: 2.7.6
[cli][๋๋ฒ๊ทธ] ์คํธ๋ฆผ๋งํฌ: 0.13.0+27.g2ff314c
[cli][๋๋ฒ๊ทธ] Requests(2.19.1), Socks(1.6.7), Websocket(0.48.0)
[cli][info] URL h ttpstream ://https ://www.arconaitv.us/stream.php?id=43์ ๋ํด ์ผ์นํ๋ ํ๋ฌ๊ทธ์ธ http๋ฅผ ์ฐพ์์ต๋๋ค.
[ํ๋ฌ๊ทธ์ธ.http][๋๋ฒ๊ทธ] URL= https://www.arconaitv.us/stream.php?id=43; ๋งค๊ฐ๋ณ์={}
[cli][info] ์ฌ์ฉ ๊ฐ๋ฅํ ์คํธ๋ฆผ: ๋ผ์ด๋ธ(์ต์
, ์ต๊ณ )
[cli][info] ์คํ๋ ์คํธ๋ฆผ: ๋ผ์ด๋ธ(http)
[cli][๋๋ฒ๊ทธ] ์ฌ์ ๋ฒํผ๋ง 8192๋ฐ์ดํธ
[cli][info] ์์ ํ๋ ์ด์ด: /usr/bin/vlc
[cli][๋๋ฒ๊ทธ] ์ถ๋ ฅ์ ์คํธ๋ฆผ ์ฐ๊ธฐ
[cli][info] ์คํธ๋ฆผ ์ข
๋ฃ
[cli][info] ํ์ฌ ์ด๋ ค ์๋ ์คํธ๋ฆผ์ ๋ซ์ต๋๋ค..
์๋ํ์ง๋ง ์ด์ด ์๋ค
atlast๋ ๋ก์ปฌ PC์์ ์๋ํ๋ tvplayer๋ฅผ ์ป์์ต๋๋ค. ๋ด ๋ก์ปฌ PC์ tinyproxy๋ฅผ ์ค์นํ์ง๋ง vps httpproxy xxxx๊ฐ ์๋ํ์ง ์์ต๋๋ค.
tinyproxy๋ ๊ด์ฐฎ์ต๋๋ค. ์๋๋ฉด ๋ก์ปฌ PC์ ์ค์นํ ๋ค๋ฅธ ํ๋ก์ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค.
@maanich ์๋ ํ์ธ์. ์ด๊ฒ์ ์ด ๋ฌธ์ ์ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์๊ฑฐ๋ ์ด ๋ฌธ์ ์ถ์ ๊ธฐ๊ฐ ์์ฝ๋์ด ์๋ Requests์ ๋ํ ๊ฒฐํจ ๋ณด๊ณ ์๋ก ๋ณด์ด์ง ์์ต๋๋ค. ์์คํ ๊ตฌ์ฑ์ ๋ํ ์ง๋ฌธ์ด ์๋ ๊ฒฝ์ฐ StackOverflow ์ ๊ฐ์ ํ๋ซํผ์์ ๊ฐ์ฅ ์ ํด๊ฒฐ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌ ํด์!
streamlink --https-proxy " http://8xxxx :8000/" --tvplayer-email [email protected] --tvplayer-password vcvdf3 --http-no-ssl-verify https://tvplayer.com/watch /itv ๋ฒ ์คํธ --player-no-close --stdout | /var/tmp/youtube/ffmpeg -y -i ํ์ดํ:0 -vcodec ๋ณต์ฌ -acodec ๋ณต์ฌ -flags -global_header -hls_flags delete_segments -hls_time 10 -hls_list_size 6 /mnt/hls/arc.m3u8
ffmpeg ๋ฒ์ 4.0-์ ์ https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 FFmpeg ๊ฐ๋ฐ์
gcc 6.3.0์ผ๋ก ๋น๋(Debian 6.3.0-18+deb9u1) 20170516
๊ตฌ์ฑ: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 -- enable-libxml2 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame -- enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable -libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg
libavutil 56. 14.100 / 56. 14.100
๋ฆฌ๋ฐ๋ธ์ฝ๋ฑ 58. 18.100 / 58. 18.100
๋ฆฌ๋ฐ๋ธํฌ๋งท 58. 12.100 / 58. 12.100
๋ฆฌ๋ฐ๋ธ์ฅ์น 58. 3.100 / 58. 3.100
๋ฆฌ๋ฐ๋ธํํฐ 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
[์ฝ์][์ ๋ณด] streamlink๊ฐ ๋ฃจํธ๋ก ์คํ ์ค์
๋๋ค! ์กฐ์ฌํ์ธ์!
[์ฝ์][์ ๋ณด] URL https://tvplayer.com/watch/itv ์ ๋ํด ์ผ์นํ๋ ํ๋ฌ๊ทธ์ธ tvplayer๋ฅผ ์ฐพ์์ต๋๋ค.
์ค๋ฅ : ์ด๋ ค์๋ URL์ ์์ต๋๋ค https://live.tvplayer.com/stream.m3u8?id=204&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cCo6XC9cL2xpdmUudHZwbGF5ZXIuY29tXC9zdHJlYW0ubTN1OD9pZD0yMDQiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE1MjkwNTc0OTR9LCJJcEFkZHJlc3MiOnsiQVdTOlNvdXJjZUlwIjoiNjIuMjEwLjE0Mi42NlwvMzIifX19XX0_&Signature=mHOteYcUu4QsbGD n0e ~ 7meDUGT8VN7bVOBAHa-0Mk6ROA9XHYx3aIAZMAo3dFjOGuWk-3MszJzRFHdv ~ -CCsmX3D8XQa2zvzfuIWfMAT ~ yDshroXBN25iW6ZJ0-7lGla00jMTUpm5sW-uDy18OkiBWgGvDVas2Lz-EW ~ 5 LTw2YWvEpqkvRB9OpcsHJj9RRQLuDVjwYKXwKvHTJmB1J ~sGE3aigaL7AZyBaIAUMcpk-xYMpDuPV9BsBN9AT397lFfRPFt155u~yeBHZ4JlUN2GINUBt0-CzGuYVq3dsO kYYEZJo9cQTVhArpo7ek03VbDP5egtCM8obN63VbDP5egtCM8obN63์ค๋ฅ์ฉ ํด๋ผ์ด์ธํธ
pipe:0 : ์
๋ ฅ์ ์ฒ๋ฆฌํ ๋ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์คํธ๋ฆผ๋งํฌ์ ์ด๋ค ํ๋ก์ ์๋ฒ๊ฐ ์ข์์ง ์กฐ์ธ ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌํ๊ฒ๋ ์ด๊ฒ์ ๊ทํ๊ฐ ์๋ณํ ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์ ์ ์ผ๋ก OS X์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ํฐ๋ฆฌ OpenSSL์ ๋ฌ๋ ค ์์ต๋๋ค. ๋ฒ์ 0.9.8y๋ SSL ํธ๋์ ฐ์ดํฌ๋ฅผ ์ํํ๋ ๋ฐ ๋ช ๊ฐ์ง ์ค์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ผ๋ถ ์๋ฒ๋ ์ด๋ฅผ ์ ์ฉ๋ฉํ์ง ์์ต๋๋ค. ๋ด OS X ์์์์ Python 3์ ์ฌ์ฉํ๋ฉด(๋ฐ๋ผ์ ์ต์ OpenSSL ์ฌ์ฉ) ๋ฌธ์ ๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
๋ฅผ ์คํํ์ฌ ์ ๋ฒ์ ์ ๋ํด PyOpenSSL์ ์ค์นํฉ๋๋ค.