๋๋ ๋ฌธ์ #480์ ๋ํ ๋ ผ์๋ฅผ ์์ ํ ์ดํดํ์ง ๋ชปํ์ง๋ง ๊ทผ๋ณธ ์์ธ์ ์ด ๋ฌธ์ ์ ๋ํด ๋์ผํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๋ ค๋ฉด httpie๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ์์ฒด ์๋ช ๋ ์ค๊ฐ ์ธ์ฆ ๊ธฐ๊ด์ด์ง๋ง ํด๋น ๊ธฐ๊ด์ ์ค์ ์๋ฒ ์ธ์ฆ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด ์ธ์ฆ์๋ curl์ ํฌํจํ์ฌ ๋ด Mac(OS 10.12)์ ๋ค๋ฅธ ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ถฉ์กฑํฉ๋๋ค. Httpie๋ ๋จ์ํ ๊ทธ๊ฒ์ ์ ๋ขฐํ์ง ์์ ๊ฒ์ ๋๋ค. ์ํ ์ถ๋ ฅ:
$ http --debug -j --verify=/usr/local/etc/openssl/certs/intermediate-authority.pem https://www.testdomain.com/robots.txt
HTTPie 0.9.9
Requests 2.12.3
Pygments 2.1.3
Python 3.6.1 (default, Mar 24 2017, 17:14:46)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
/usr/local/Cellar/httpie/0.9.9/libexec/bin/python3.6
Darwin 16.5.0
<Environment {
"colors": 256,
"config": {
"__meta__": {
"about": "HTTPie configuration file",
"help": "https://github.com/jkbrzt/httpie#config",
"httpie": "0.9.4"
},
"default_options": "[]"
},
"config_dir": "/Users/username/.httpie",
"is_windows": false,
"stderr": "<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>",
"stderr_isatty": true,
"stdin": "<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>",
"stdin_encoding": "UTF-8",
"stdin_isatty": true,
"stdout": "<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>",
"stdout_encoding": "UTF-8",
"stdout_isatty": true
}>
>>> requests.request(**{
"allow_redirects": false,
"auth": "None",
"cert": "None",
"data": "",
"files": {},
"headers": {
"Accept": "application/json, */*",
"Content-Type": "application/json",
"User-Agent": "HTTPie/0.9.9"
},
"method": "get",
"params": {},
"proxies": {},
"stream": true,
"timeout": 30,
"url": "https://www.testdomain.com/robots.txt",
"verify": "/usr/local/etc/openssl/certs/intermediate-authority.pem"
})
http: error: SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749) while doing GET request to URL: https://www.testdomain.com/robots.txt
Traceback (most recent call last):
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 588, in urlopen
self._prepare_proxy(conn)
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 801, in _prepare_proxy
conn.connect()
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 323, in connect
ssl_context=context)
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
_context=self, _session=session)
File "/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in __init__
self.do_handshake()
File "/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
self._sslobj.do_handshake()
File "/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/adapters.py", line 423, in send
timeout=timeout
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 624, in urlopen
raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/http", line 11, in <module>
load_entry_point('httpie==0.9.9', 'console_scripts', 'http')()
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/httpie/__main__.py", line 11, in main
sys.exit(main())
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/httpie/core.py", line 227, in main
log_error=log_error,
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/httpie/core.py", line 99, in program
final_response = get_response(args, config_dir=env.config.directory)
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/httpie/client.py", line 70, in get_response
response = requests_session.request(**kwargs)
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/local/Cellar/httpie/0.9.9/libexec/lib/python3.6/site-packages/requests/adapters.py", line 497, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
--verify=no
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ๊ฒฐ์ด ํ์ฉ๋ฉ๋๋ค. ์ธ์ฆ์ ํ์ผ์ ๋ณ๊ฒฝ ์์ด PEM ๋์ DER ํ์์ผ๋ก ๋ณํํด ๋ณด์์ต๋๋ค.
Httpie๋ ์์ฒด Python3์ ์ข ์์ฑ์ผ๋ก ์ค์นํ Homebrew๋ฅผ ํตํด ์ค์น๋์์ต๋๋ค.
์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฅผ ์๋ฝํ๋ฉด ์ํํฉ๋๋ค. ํด์ปค๋ ์์ฒด ์๋ช ๋ ์๋ช ์ ๊ฐ๋จํ ์ฝ์ ํ์ฌ ๊ทธ๋ ์ง ์์ ๋์ ์ฌ์ฉ์๊ฐ ์์ ํ๋ค๊ณ ๋๋ผ๊ฒ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ฒด ์๋ช
์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ์ ๋จ์ํ ์คํจํ๋ ๊ฒ๋ณด๋ค ๋ช
ํํ ๋ฉ์์ง๋ก ์๋ตํ๋ ค๋ฉด httpie
๋ฅผ ์ ์ํฉ๋๋ค. ํ
์คํธ ๋ชฉ์ ์ผ๋ก ๊ฒ์ฆ์ ๋นํ์ฑํํ๊ธฐ ์ํด --verify=no
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@giskard22
๋๋ ๋ฌธ์ #480์ ๋ํ ๋ ผ์๋ฅผ ์์ ํ ์ดํดํ์ง ๋ชปํ์ง๋ง ๊ทผ๋ณธ ์์ธ์ ์ด ๋ฌธ์ ์ ๋ํด ๋์ผํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๋ ค๋ฉด httpie๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ์์ฒด ์๋ช ๋ ์ค๊ฐ ์ธ์ฆ ๊ธฐ๊ด์ด์ง๋ง ํด๋น ๊ธฐ๊ด์ ์ค์ ์๋ฒ ์ธ์ฆ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
#480์ ๋ณด๋ฉด ์ด๊ฒ์ ๋์ผํ ๊ทผ๋ณธ ์์ธ์ด ์๋๋๋ค. ์ด ๊ฒฝ์ฐ HTTPie๋ ์ ๊ณตํ ๋ฒ๋ค์ ์ฌ์ฉํฉ๋๋ค.
๋ด๊ฐ ์์ฌํ๋ ๊ฒ์ ์ค์ ๋ก ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"ํ
์คํธ ๋๋ฉ์ธ"์ ์ ์ฒด ์ธ์ฆ์ ์ฒด์ธ์ ๋ฐํํ์ง ์๊ณ ๋ฆฌํ(์ฒด์ธ์ ๋๋จธ์ง ๋ถ๋ถ์ ๋์ ์ผ๋ก ๊ฒ์ํ ์ ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ์ ์๋ํจ)๋ง ๋ฐํํ์ง๋ง httpie ๋ฐ ๊ธฐํ ๋น ๋ธ๋ผ์ฐ์ ํด๋ผ์ด์ธํธ์์๋ ๋ฐํํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ --verify
๋ฅผ ํตํด ์ฒด์ธ์ ์ผ๋ถ ๋ฅผ ์ ๊ณตํ์ง๋ง ์ฌ์ ํ ๋ชจ๋ ์ค๊ฐ์๋ ์๋๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ํ๋์ ๋ฒ๋ค์ ๋ฃ๊ณ ๋์ ์ ๊ณตํ๋ค๋ฉด ์ด๊ฒ์ด ์๋ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฅผ ์๋ฝํ๋ฉด ์ํํฉ๋๋ค. ํด์ปค๋ ์์ฒด ์๋ช ๋ ์๋ช ์ ๊ฐ๋จํ ์ฝ์ ํ์ฌ ๊ทธ๋ ์ง ์์ ๋์ ์ฌ์ฉ์๊ฐ ์์ ํ๋ค๊ณ ๋๋ผ๊ฒ ํ ์ ์์ต๋๋ค.
@alvis ๋ด์ ์กฐ์ธ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ชป๋์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ์๋ ๋งค์ฐ ๋๋ผ์ธ ์ ๋๋ก ์๋ชป๋์์ต๋๋ค. ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ๋๋ค. ๋๋ ์ฌ๊ธฐ์ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ @giskard22 ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ชจ๋ฅด๊ณ ๋น์ ๋ ๋ชจ๋ฆ ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ทํ์ ์กฐ์ธ์ @giskard22 ์๊ฒ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์์ ๋ฟ๋ง ์๋๋ผ ์ด ์ ์ฅ์์ ๋ฌธ์ ๋ก๋ถํฐ ์ด๋ฉ์ผ ์๋ฆผ์ ๋ฐ๋ ๋๋จธ์ง ์ฌ๋๋ค์๊ฒ๋ ์์์ด ๋ฉ๋๋ค.
์์ฒด ์๋ช ๋ ์ธ์ฆ์ ๋ ๊ฒ์ฆ ์์ด ์ ๋ขฐํ๋ ๊ฒ์ด ์ํ @giskard22 ๋ ์ ๋ขฐ ์ฒด์ธ์ ์๊ณ ์ ๋ขฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์ด ์ฌ์ฉ์ ์๋ฒฝํ๊ฒ ์์ ํฉ๋๋ค. ์, ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ผ ํ ์๋ ์๋ HTTPS๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ดํธ์์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์ง
์, ์ฌ๊ธฐ์ ์ฌ์ฉ ์ฌ๋ก๋ ํธ๋ํฝ์ ๊ฒ์ฌํ ์ ์๋๋ก HTTPS ์ค๊ฐ์(man-in-the-middle)๋ฅผ ์ํํ๋ ํ์ฌ ์น ํ๋ก์๋ฅผ ํตํด httpie๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ฆ์์์ ๋๋ฉ์ธ๋ณ ์ธ์ฆ์๋ฅผ ์์ฑํฉ๋๋ค. ใ ใ ใ
ํ๋ก์๊ฐ ์ ์ฒด ์ธ์ฆ์ ์ฒด์ธ์ ์ ๊ณตํ์ง ๋ชปํด ์ด๋ป๊ฒ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ดํดํ ์ ์์ต๋๋ค. ์๋ง๋ OpenSSL์ ๋์(๋๋ Python์ ๋์์ธ๊ฐ์?)์ MacOS์ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์ปค๋์ฆ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
ํ๋ก์๋ฅผ ํตํ ์ฐ๊ฒฐ์ ๋ํ ์ ๋ขฐ ์ฒด์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธ์ฆ์ 3์ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ฆ์ 2๋ ํ๋ก์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ด ํค์ฒด์ธ์ผ๋ก ๊ฐ์ ธ์ SSL ์ฌ์ฉ์ ๋ํด ์ ๋ขฐํ ์ ์๋ ๊ฒ์ผ๋ก ํ์ํ์ต๋๋ค. curl๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ํฌํจํ์ฌ httpie๋ฅผ ์ ์ธํ Mac์ ๋ชจ๋ ๊ฒ์ ๋ง์กฑ์ํค๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค. ๊ด์ฐฐ๋ ๋์์ ๊ฒ์ฆ ๋ฉ์ปค๋์ฆ์ด ์ ๋ขฐํ ์ ์๋ ์ธ์ฆ์๋ฅผ ์ฐพ์ ๋๊น์ง ์ฒด์ธ์ ๋ฐ๋ฅธ ๋ค์ ์ค์งํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฃจํธ ์ธ์ฆ์์ ๋ถ์ฌ๋ ๊ด๋ จ์ด ์์ต๋๋ค.
์ด๊ธฐ ๋ณด๊ณ ์์ ๊ฒ์ํ httpie ๋๋ฒ๊ทธ ์ถ๋ ฅ์์ intermediate-authority.pem
์ ์ธ์ฆ์ 2๋ฅผ ์ ์ฅํ๊ณ ํด๋น ํ์ผ์ --verify
. httpie์ ๊ฒฝ์ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฉฐ ์ธ์ฆ์ 3๋ ์ ๊ณตํด์ผ ํ๋ค๋ ๋ง์์ด์ ๊ฐ์?
์๋ง๋ OpenSSL์ ๋์(๋๋ Python์ ๋์์ธ๊ฐ์?)์ MacOS์ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์ปค๋์ฆ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ OpenSSL์ ์ ๊ณตํ ๋ฒ๋ค์์ ๋๋ฝ๋ ํญ๋ชฉ์ ์ฐพ์ต๋๋ค. ๊ฑฐ๊ธฐ์์ ์ฐพ์ ์ ์์ผ๋ฉด ํ์ธ์ ์คํจํฉ๋๋ค. ์ด๊ฒ์ ๋ํ Python์ ํ๋์ด๊ธฐ๋ ํฉ๋๋ค. SecureTransport(MacOS์ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์ปค๋์ฆ)๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ์๋ํ์ง๋ง ์ธ์ฆ์๊ฐ MacOS์ ํค์ฒด์ธ์ ์๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค. ๋ํ MacOS์์ ๊ธฐ๋ณธ Python์๋ Keychain์ ์ฌ์ฉํ๋ OpenSSL์ ํดํน๋ ๋ฒ์ (๋ ๋์ ์ฉ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์)์ด ์์ผ๋ฏ๋ก ์์ฒด ์ธ์ฆ์ ๋ฒ๋ค์ ์ ๊ณตํ๋๋ผ๋(์ฆ, ์ ๋ขฐํ๋๋ก๋ง ์ง์ํ๋ ๊ฒฝ์ฐ์๋ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฒ๋ค ํ์ผ์ ์๋ ๋ด์ฉ์ "LOL, ํ์ง๋ง ํค์ฒด์ธ ์ก์ธ์ค ๊ถํ์ด ์๊ณ ์ด๋ฅผ ์ ๋ขฐํ๋ฏ๋ก YOLO"๋ผ๊ณ ํ์๋ฉ๋๋ค. ๋๋ YOVO?(You Only Verify Once... Idk)).
์ด๋ฌํ ์ฆ์ ์ธ์ฆ์์ ๋ํ ์ ์ฒด ์ ๋ขฐ ์ฒด์ธ์ด ๊ทํ๊ฐ ์ค๋ช ํ ๋๋ก๋ผ๋ฉด ์ฒด์ธ์ ๋งํฌ 2์ 3 ๋ง ํฌํจํ๋ ๋ฒ๋ค์ ๋ณด์ ํ๋ ๊ฒ์ผ๋ก ๋ฒ์ด๋ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ httpie
from homebrew
๋ฅผ MacOS์ ์ค์นํ๋ค๋ฉด OpenSSL
, Python
๋ฐ virtualenv
์ ์์ ๋ฒ์ ๊ณผ ํจ๊ป ์ค์น๋์์ต๋๋ค. ์ด๊ฒ์ด Mac์ ํดํน๋ OpenSSL์ ์ด์ฉํ ์ ์๋ ์ด์ ์
๋๋ค.
๋ง์นจ๋ด ์์ฒด ์๋ช
๋ ๋ฃจํธ ์ธ์ฆ์๋ฅผ ์๋ณํ๊ณ ์ป์ ์ ์์์ต๋๋ค. ํด๋น ์ธ์ฆ์์ ์ค๊ฐ ์ธ์ฆ์๋ฅผ ๋ชจ๋ .pem ํ์ผ์ ๋ฃ๊ณ ํด๋น ํ์ผ์ --verify
์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ ์ด์ SSL ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ข๋ค! ์ ์๋ ๋๋ก OpenSSL์๋ ์ ์ฒด ์ธ์ฆ์ ์ฒด์ธ์ด ํ์ํฉ๋๋ค. SecureTransport์ ๋ฌ๋ฆฌ ์๋์ผ๋ก ์ ๊ณตํ๋๋ผ๋ ๋ถ๋ถ ์ฒด์ธ์ ํ์ฉํ์ง ์์ต๋๋ค.
๋ค์ ์ถ๊ฐ ํฉ๋ณ์ฆ์ ๋ํ ์๊ฐ์ด ์์ต๋๊น? ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ ์ธ์ฆ์๋ฅผ ์ฝ์
ํ์ง ์๊ณ ๋ ํธ๋ํฝ์ด ํน์ ๋๋ฉ์ธ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ --verify
์ธ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ง๋ง ์ฌ๋์ด ์ด๊น๋๋ค. ์ฌ๋ฌ ์ธ์ฆ์ ๋ฒ๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์์ฒญ ์ OpenSSL์์ ์ ๊ณตํ๋ ๋ฃจํธ CA ๋ฒ๋ค๊ณผ ์ฌ์ฉ์ ์ง์ ๋ฒ๋ค์ ์ฐ๊ฒฐํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ฐ๋ผ์ OpenSSL์ ๊ฒ์ฆ์ ์ํด .pem
ํ์ผ๋ก ๊ฐ๋ ์ฐฌ ๋๋ ํ ๋ฆฌ ์ ๊ณต์ ์ง์ํฉ๋๋ค. ์ฆ, Python์์ ์ด์ ๋ํ ์ง์์ด ๋ถ์กฑํฉ๋๋ค. ์์งํ Python 3.5 ๋๋ 3.6๋ณด๋ค ์ค๋๋ ๊ฒ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ํ๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฉฐ pyOpenSSL์ด ์ง์ํ ๊ฒ์ธ์ง ๊ธฐ์ต๋์ง ์์ต๋๋ค. ์์ ์ ํ๋์ ๋ชจ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ .pem
ํ์ผ ์์ด๋ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ ์ ์๋ค๊ณ ์๊ฐํ๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ ๋ค๋ฅธ ๋ฌธ์ ๋ HTTPie๊ฐ ์ฌ์ฉํ๋ HTTP ์ ์ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฒ์ ๋ฐ TLS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ ์ ๋ฐ์ ๊ฑธ์ณ ์ ํ๋ ์ง์์ ์ ๊ณตํ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ ํ ์ง์ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
ol' Postman์ด ๊ตฌ์ถํฉ๋๋ค. ์์ฒด ์๋ช ๋ ์ธ์ฆ์ ๊ฐ์ง๋ฅผ ๋ ์ ์์ต๋๋ค.
SSL์ ํ๋ฅญํฉ๋๋ค. ์๋ง๋ ๊ฐ๋ฐ์๋ค์ ์๊ณ ์์ ๊ฒ์
๋๋ค. ์ฝ๋ ์ผ์ด์ค ๋ฐ ์ธ์ด ์ ํ ๋๋ ์
์ทจ๋ก ์ธํด SSL์ ๋นํ์ฑํํฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ผ์ ๋๋ด๊ณ ์ถ์ดํ๋ค๋ ๊ฒ์ ์๋๋ค. ์ธ์ SSL์ด ์ข๋ค๊ณ ๋งํ๊ณ "SSL ํ์ธ ๋นํ์ฑํ"๋ผ๊ณ ๋งํ ๋ ๋์ผํ ์ง๊ฐ ๋ฐ์์ ๋ณด์ผ์ง ๊ถ๊ธํฉ๋๋ค. SSL ํ์ธ์ ๋นํ์ฑํํ๋ฉด SSL์ด ๊บผ์ง๋๋ค. ํ์ง๋ง SSL์ ์ข์ต๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋ ์๊ณ ์์ฃ ? SSL ๊ฒ์ฆ์ด SSL์ ์ ๋ถ๋ผ๋ ์ฌ์ค์ด ํผ๋์ค๋ฝ๊ฑฐ๋ ์์์ ์ธ ์ง์์
๋๊น? ์ฐํธ ๋ฐฐ๋ฌ๋ถ๊ฐ SSL ํ์ธ์ ๋นํ์ฑํํ๋ ์ต์
์ด ์๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์์ ํ์ง ์์ ๊ฒ์ ๋งํ๋ ๋ฉ์ง ๋ฐฉ๋ฒ์
๋๊น? curl์๋ --insecure
ํ๋๊ทธ์ ๋์ผํ ์ต์
์ด ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ ํํ ์จ๊ธฐ๋ ๋ฉ์ง ๋ฐฉ๋ฒ์
๋๊น(SSL์ ๋๋๋ค)? Postman์์ ํ
์คํธํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. Postman์ด ๊ทธ ์ต์
์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ TIL. ๋ค์ ์ผ๋ณผ๊น? ์๋๋ฉด ๋ชจ๋ ํ์ฌ ๋ฐ ๋ฏธ๋ ํ๋ก์ ํธ์ ๋ํด SSL์ ๋นํ์ฑํํ์ต๋๊น? ์ปคํผ์์์ API ํค๋ฅผ ๋ณด๋ด๊ณ ์์ต๋๊น? :|
์ธ์ ๊ฐ๋ https ๊ฐ๋ฐ ๋จธ์ , ์์ฒด ์๋ช ์ธ์ฆ์ ๋ฐ ๊ธฐ์ CA๊ฐ ์คํฌ๋ฆฝํธ ๊ฐ๋ฅํ ์๋ letsencrypt ์ธ์ฆ์๋ก ๋์ฒด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ด์ฌ์ด ์์คํ ํค์ฒด์ธ/ssl ์ ์ฅ์๋ฅผ ์ ๋ขฐํ ๋ http๋ฅผ ๋ ์ ๊ธฐ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ์ด ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ ์ปฌ ๊ต์ฒด์ ๋๋ค. golang์๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ์ด์ ์ฒด์ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ go๋ก ์์ฑ๋ ์ต์ ์ปฌ ๋์ฒด(์: bat)๋ ๋ฉ์ง ์ถ๋ ฅ๊ณผ ๋ฉ์ง CLI ํ๊ฒฝ์ ์ ๊ณตํ๋ฉฐ ์ฌ์ฉ์ ์ง์ CA ๋๋ SSL ์ข ๋ฃ(๋ก๋ ๋ฐธ๋ฐ์)๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
SSL์ ํ๋ฅญํฉ๋๋ค. ์๋ง๋ ๊ฐ๋ฐ์๋ค์ ์๊ณ ์์ ๊ฒ์ ๋๋ค. ์ฝ๋ ์ผ์ด์ค ๋ฐ ์ธ์ด ์ ํ ๋๋ ์ ์ทจ๋ก ์ธํด SSL์ ๋นํ์ฑํํฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ผ์ ๋๋ด๊ณ ์ถ์ดํ๋ค๋ ๊ฒ์ ์๋๋ค. ์ธ์ SSL์ด ์ข๋ค๊ณ ๋งํ๊ณ "SSL ํ์ธ ๋นํ์ฑํ"๋ผ๊ณ ๋งํ ๋ ๋์ผํ ์ง๊ฐ ๋ฐ์์ ๋ณด์ผ์ง ๊ถ๊ธํฉ๋๋ค. SSL ํ์ธ์ ๋นํ์ฑํํ๋ฉด SSL์ด ๊บผ์ง๋๋ค. ํ์ง๋ง SSL์ ์ข์ต๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋ ์๊ณ ์์ฃ ? SSL ๊ฒ์ฆ์ด SSL์ ์ ๋ถ๋ผ๋ ์ฌ์ค์ด ํผ๋์ค๋ฝ๊ฑฐ๋ ์์์ ์ธ ์ง์์ ๋๊น? ์ฐํธ ๋ฐฐ๋ฌ๋ถ๊ฐ SSL ํ์ธ์ ๋นํ์ฑํํ๋ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์์ ํ์ง ์์ ๊ฒ์ ๋งํ๋ ๋ฉ์ง ๋ฐฉ๋ฒ์ ๋๊น? curl์๋
--insecure
ํ๋๊ทธ์ ๋์ผํ ์ต์ ์ด ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ ํํ ์จ๊ธฐ๋ ๋ฉ์ง ๋ฐฉ๋ฒ์ ๋๊น(SSL์ ๋๋๋ค)? Postman์์ ํ ์คํธํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. Postman์ด ๊ทธ ์ต์ ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ TIL. ๋ค์ ์ผ๋ณผ๊น? ์๋๋ฉด ๋ชจ๋ ํ์ฌ ๋ฐ ๋ฏธ๋ ํ๋ก์ ํธ์ ๋ํด SSL์ ๋นํ์ฑํํ์ต๋๊น? ์ปคํผ์์์ API ํค๋ฅผ ๋ณด๋ด๊ณ ์์ต๋๊น? :|์ธ์ ๊ฐ๋ https ๊ฐ๋ฐ ๋จธ์ , ์์ฒด ์๋ช ์ธ์ฆ์ ๋ฐ ๊ธฐ์ CA๊ฐ ์คํฌ๋ฆฝํธ ๊ฐ๋ฅํ ์๋ letsencrypt ์ธ์ฆ์๋ก ๋์ฒด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ด์ฌ์ด ์์คํ ํค์ฒด์ธ/ssl ์ ์ฅ์๋ฅผ ์ ๋ขฐํ ๋ http๋ฅผ ๋ ์ ๊ธฐ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ์ด ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ ์ปฌ ๊ต์ฒด์ ๋๋ค. golang์๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ์ด์ ์ฒด์ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ go๋ก ์์ฑ๋ ์ต์ ์ปฌ ๋์ฒด(์: bat)๋ ๋ฉ์ง ์ถ๋ ฅ๊ณผ ๋ฉ์ง CLI ํ๊ฒฝ์ ์ ๊ณตํ๋ฉฐ ์ฌ์ฉ์ ์ง์ CA ๋๋ SSL ์ข ๋ฃ(๋ก๋ ๋ฐธ๋ฐ์)๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์๋, ์ข์ง ์์. ์์ ๊ฐ๋ฐ์ ์ธ์ฆ์๊ฐ ์๋๋ผ๋ ๋ง๋ฆด ์ ์์ด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฅผ ์๋ฝํ๋ฉด ์ํํฉ๋๋ค. ํด์ปค๋ ์์ฒด ์๋ช ๋ ์๋ช ์ ๊ฐ๋จํ ์ฝ์ ํ์ฌ ๊ทธ๋ ์ง ์์ ๋์ ์ฌ์ฉ์๊ฐ ์์ ํ๋ค๊ณ ๋๋ผ๊ฒ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ์ ๋จ์ํ ์คํจํ๋ ๊ฒ๋ณด๋ค ๋ช ํํ ๋ฉ์์ง๋ก ์๋ตํ๋ ค๋ฉด
httpie
๋ฅผ ์ ์ํฉ๋๋ค. ํ ์คํธ ๋ชฉ์ ์ผ๋ก ๊ฒ์ฆ์ ๋นํ์ฑํํ๊ธฐ ์ํด--verify=no
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.