<p>httpie๊ฐ€ ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ ์‹ ๋ขฐ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2017๋…„ 04์›” 25์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: httpie/httpie

๋‚˜๋Š” ๋ฌธ์ œ #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 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  9 ๋Œ“๊ธ€

์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๋ฉด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์ปค๋Š” ์ž์ฒด ์„œ๋ช…๋œ ์„œ๋ช…์„ ๊ฐ„๋‹จํžˆ ์‚ฝ์ž…ํ•˜์—ฌ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๋Š๋ผ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์— ๋‹จ์ˆœํžˆ ์‹คํŒจํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช…ํ™•ํ•œ ๋ฉ”์‹œ์ง€๋กœ ์‘๋‹ตํ•˜๋ ค๋ฉด httpie ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ๊ฒ€์ฆ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด --verify=no ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@giskard22

๋‚˜๋Š” ๋ฌธ์ œ #480์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ทผ๋ณธ ์›์ธ์€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋™์ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•˜๋ ค๋ฉด httpie๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ์ž์ฒด ์„œ๋ช…๋œ ์ค‘๊ฐ„ ์ธ์ฆ ๊ธฐ๊ด€์ด์ง€๋งŒ ํ•ด๋‹น ๊ธฐ๊ด€์˜ ์‹ค์ œ ์„œ๋ฒ„ ์ธ์ฆ์„œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#480์„ ๋ณด๋ฉด ์ด๊ฒƒ์€ ๋™์ผํ•œ ๊ทผ๋ณธ ์›์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ HTTPie๋Š” ์ œ๊ณตํ•œ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜์‹ฌํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์›์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"ํ…Œ์ŠคํŠธ ๋„๋ฉ”์ธ"์€ ์ „์ฒด ์ธ์ฆ์„œ ์ฒด์ธ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋ฆฌํ”„(์ฒด์ธ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๋™์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•จ)๋งŒ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ httpie ๋ฐ ๊ธฐํƒ€ ๋น„ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ --verify ๋ฅผ ํ†ตํ•ด ์ฒด์ธ์˜ ์ผ๋ถ€ ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ชจ๋“  ์ค‘๊ฐœ์ž๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค์— ๋„ฃ๊ณ  ๋Œ€์‹  ์ œ๊ณตํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๋ฉด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์ปค๋Š” ์ž์ฒด ์„œ๋ช…๋œ ์„œ๋ช…์„ ๊ฐ„๋‹จํžˆ ์‚ฝ์ž…ํ•˜์—ฌ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๋Š๋ผ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alvis ๋‹ด์š” ์กฐ์–ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜๋ชป๋˜์—ˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ์—๋Š” ๋งค์šฐ ๋†€๋ผ์šธ ์ •๋„๋กœ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” @giskard22 ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ชจ๋ฅด๊ณ  ๋‹น์‹ ๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ท€ํ•˜์˜ ์กฐ์–ธ์€ @giskard22 ์—๊ฒŒ ๊ฑฐ์˜ ์“ธ๋ชจ๊ฐ€ ์—†์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด ์ €์žฅ์†Œ์˜ ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์ด๋ฉ”์ผ ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ๋‚˜๋จธ์ง€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ์†Œ์Œ์ด ๋ฉ๋‹ˆ๋‹ค.

์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ ๋Š” ๊ฒ€์ฆ ์—†์ด ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์ด ์œ„ํ—˜ @giskard22 ๋Š” ์‹ ๋ขฐ ์ฒด์ธ์„ ์•Œ๊ณ  ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ด ์‚ฌ์šฉ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์ดํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์ง

์˜ˆ, ์—ฌ๊ธฐ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก HTTPS ์ค‘๊ฐ„์ž(man-in-the-middle)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํšŒ์‚ฌ ์›น ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด httpie๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰์„์—์„œ ๋„๋ฉ”์ธ๋ณ„ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ใ…‹ใ…‹ใ…‹

ํ”„๋ก์‹œ๊ฐ€ ์ „์ฒด ์ธ์ฆ์„œ ์ฒด์ธ์„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•ด ์–ด๋–ป๊ฒŒ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ OpenSSL์˜ ๋™์ž‘(๋˜๋Š” Python์˜ ๋™์ž‘์ธ๊ฐ€์š”?)์€ MacOS์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์‹ ๋ขฐ ์ฒด์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. www.testdomain.com์— ์ฆ‰์‹œ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰
  2. proxy-name์ด๋ผ๋Š” ์ค‘๊ฐ„ CA ์ธ์ฆ์„œ
  3. ํšŒ์‚ฌ ์ด๋ฆ„์ด๋ผ๋Š” ์ž์ฒด ์„œ๋ช…๋œ ๋ฃจํŠธ CA ์ธ์ฆ์„œ

์ธ์ฆ์„œ 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 ์ข…๋ฃŒ(๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ)๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, ์ข‹์ง€ ์•Š์•„. ์ž„์‹œ ๊ฐœ๋ฐœ์ž ์ธ์ฆ์„œ๊ฐ€ ์žˆ๋”๋ผ๋„ ๋ง๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰