Requests: SSLError "์ž˜๋ชป๋œ ํ•ธ๋“œ์…ฐ์ดํฌ: ์˜ค๋ฅ˜([('SSL ๋ฃจํ‹ด', 'tls_process_server_certificate', '์ธ์ฆ์„œ ํ™•์ธ ์‹คํŒจ')],) ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ ์‚ฌ์šฉ

์— ๋งŒ๋“  2017๋…„ 11์›” 10์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

์—ฌ๋ณด์„ธ์š”. https๋กœ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ฆ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํฌํ•จ๋˜๋Š” ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ์ธ ์ธ์ฆ์„œ๊ฐ€ ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” '์ธ์ฆ์„œ ๊ฒ€์ฆ ์‹คํŒจ' ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ธ์ฆ์„œ๊ฐ€ ์ž์ฒด ์„œ๋ช…(Microsoft IIS์— ์˜ํ•ด)๋˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ curl์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋‹ค์Œ์€ openssl ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

openssl s_client -showcerts -connect server:44300
CONNECTED(00000003)
depth=0 CN = server
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = server
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=server
   i:/CN=server
-----BEGIN CERTIFICATE-----
<certificate data here>
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=server
issuer=/CN=server
---
No client certificate CA names sent
Peer signing digest: SHA1
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1477 bytes and written 431 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: CC4A000083B1E03B446416C9C0B16CBEAB79949E3CF5C936A309A6F92FA01364
    Session-ID-ctx:
    Master-Key: 798A570B0EC2A0CBB7C4C4DE6167E7579A92239942D869CD794B8BEBEA6EB5E492394634AD32665A8BB829DE1F3858D2
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1510329948
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

์˜ˆ์ƒ ๊ฒฐ๊ณผ

์ธ์ฆ์„œ๊ฐ€ verify ๋งค๊ฐœ๋ณ€์ˆ˜์— ์žˆ์œผ๋ฏ€๋กœ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. Python ์™ธ๋ถ€์—์„œ curl๋กœ ๋™์ผํ•˜๊ฒŒ ์‹œ๋„ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

curl https://server:44300 --cacert /usr/share/ca-certificates/server.crt
 HTTP/1.1 403 Forbidden
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 1158
Content-Type: text/html
Server: Microsoft-IIS/10.0
X-Frame-Options: SAMEORIGIN
P3P: CP=None
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Headers: X-Requested-With,Content-Type
Access-Control-Allow-Credentials: true
Date: Fri, 10 Nov 2017 16:02:26 GMT

(์‹คํŒจํ•˜์ง€๋งŒ ์ธ์ฆ์„œ ๋ฌธ์ œ๋กœ ์ธํ•œ ๊ฒƒ์€ ์•„๋‹˜)

์‹ค์ œ ๊ฒฐ๊ณผ

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "xxxxx/TestVirtualEnv/local/lib/python2.7/site-packages/requests/adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='nlybstqvp4nb75n.code1.emi.philips.com', port=44300): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

๋ฒˆ์‹ ๋‹จ๊ณ„

import requests
requests.get('https://server:44300', verify='/usr/share/ca-certificates/server.crt')

์‹œ์Šคํ…œ ์ •๋ณด

$ python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": "2.1.3"
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "2.7.12"
  },
  "platform": {
    "release": "4.10.0-38-generic",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "1010007f",
    "version": "17.3.0"
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "1000207f"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": true
}

์ด ๋ช…๋ น์€ ์š”์ฒญ v2.16.4 ์ด์ƒ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด,
์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค(Python ๋ฒ„์ „,
์šด์˜ ์ฒด์ œ, &c).

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

python requests ๋ชจ๋“ˆ์˜ ์ดˆ๋ณด์ž์ด๊ณ  ๋ณด์•ˆ ์‚ฌ์ดํŠธ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Certificate verify failed ๋ฐ ๋ชจ๋“  ์ดˆ๋ณด์ž ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฉธ๋งํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. auth = session.post( mysecureurl, verify=false) ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋งค์šฐ ๋‚˜์œ ์Šต๊ด€์ด๋ฉฐ ๋งŽ์€ SO ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด ๋‚™๋‹ดํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ดˆ๋ณด์ž๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์˜ค์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
Python(pip) ๋ฐ Conda ๋ฐ ๋ชจ๋“  Python ๊ธฐ๋ฐ˜ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ„๋„์˜ ์ธ์ฆ์„œ ์ €์žฅ์†Œ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Python ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์ฒด CA ํŒŒ์ผ ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์„ค์น˜๋œ ๊ฒฝ์šฐ certifi ํŒจํ‚ค์ง€์˜ ์ธ์ฆ์„œ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ pip๋Š” curl ์™€ ๋‹ฌ๋ฆฌ ์‹œ์Šคํ…œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ requests ์˜ ๊ฒฝ์šฐ conda ๋˜๋Š” pip๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„œ ์ €์žฅ์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tldr;

  1. ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ์ด ๋†€๋ผ์šด ๋ธ”๋กœ๊ทธ ์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  .cer ์ธ์ฝ”๋”ฉ๋œ ์ธ์ฆ์„œ ์ฒด์ธ์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ธ”๋กœ๊ทธ๋Š” conda certstore๊ฐ€ ์•„๋‹ˆ๋ผ git certstore์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ฃจํŠธ๋งŒ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ธ์ฆ์„œ ์ฒด์ธ์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ์œผ๋กœ pip install certifi ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ certifi ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  3. conda ๋˜๋Š” python์˜ ์ธ์ฆ์„œ ์ €์žฅ์†Œ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

import ssl
ssl.get_default_verify_paths() ๋˜๋Š”
import certifi
certifi.where()

  1. ๊ธฐ๋ณธ cacert.pem ํŒŒ์ผ์„ ์ฐพ์•˜์œผ๋ฉด ์ด ํŒŒ์ผ์„ ์—ด๊ณ (๋ฉ”๋ชจ์žฅ++๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค) ํŒŒ์ผ ๋์— ๋ชจ๋“  ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (์ธ์ฆ์„œ ๊ตฌ๋ถ„ -----BEGIN CERTIFICATE----- ๋ฐ -----END CERTIFICATE----- ). ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    ๋˜๋Š” conda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ conda ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
    conda config --set ssl_verify <pathToYourFile>.crt
    (๋‚˜๋Š” ์ด ๋ช…๋ น์ด C:\Users\johndoe\.condarc ์˜ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค)

  2. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    import certifi
    auth = session.post('https://mysecuresite.com/', cert=());

๋˜ํ•œ Linux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋งํฌ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ cacert๋ฅผ ์‹œ์Šคํ…œ ์ „์ฒด ๋˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœํ•„( .bashrc ๋˜๋Š” .bash_profile )๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

BTW, ์ด๊ฒƒ์€ Ubuntu 16.04์ž…๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” ์ธ์ฆ์„œ ์ž์ฒด๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์œ ํšจํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. PEM์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ธ์ฆ์„œ ์ž์ฒด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•. ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธ์ฆ์„œ์ž…๋‹ˆ๋‹ค:
-----์ธ์ฆ์„œ ์‹œ์ž‘-----
MIID3TCCAsWgAwIBAgIIU/nMdlbWojMwDQYJKoZIhvcNAQELBQAwMDEuMCwGA1UE
AwwlTkxZQlNUUVZQNE5CNzVOLmNvZGUxLmVtaS5waGlsaXBzLmNvbTAeFw0xNzEx
MTAwMDAwMDBaFw0yNzExMTAwMDAwMDBaMDAxLjAsBgNVBAMMJU5MWUJTVFFWUDRO
Qjc1Ti5jb2RlMS5lbWkucGhpbGlwcy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQC3mzWep6k1/FbkzzoyZ8QBy/tE8adfwKvw80zaLL+car1bBZ9U
VIXs4es3babtjD3QJWP5/mwoBdIp8gvQkjA1X7RBNJZXbPz6hGR4eqaeRQLrFV9Y
TtB92MA9CDpCXfalCvzzO1jw3zvP1BHUdnTQEwSnnwtf/Ryaud+e7TDxGq8LThmc
glZgO8d2zaYpIjwWx92bXDF/qlqWBkH5mtKIkWOw6Y71xz0Di62cFrMAPEGBjK3c
szpBa5Ttb9+SFtl16t2xDyCbiPFkoMW/4u3Husy/i18hLhEuQwZMHnWsocm+etZ4
8fDt5Bqhab8zC+LKS+Ll7qZdqMHzobeB6j5JAgMBAAGjgfowgfcwXwYDVR0jBFgw
VoAUGdJ3os9nPtTubuwcy1ugtDMdSMChNKQyMDAxLjAsBgNVBAMMJU5MWUJTVFFW
UDROQjc1Ti5jb2RlMS5lbWkucGhpbGlwcy5jb22CCFP5zHZW1qIzMB0GA1UdDgQW
BBQZ0neiz2c+1O5u7BzLW6C0Mx1IwDAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIE
sDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwOwYDVR0RBDQwMoIlTkxZ
QlNUUVZQNE5CNzVOLmNvZGUxLmVtaS5waGlsaXBzLmNvbYIJbG9jYWxob3N0MA0G
CSqGSIb3DQEBCwUAA4IBAQC0MtflowNB4LTLKD1MW3w0QIY5ale3/sEhNCQgHGN5
iNZJptFuFt5jgPGmFjy0Pb5vLMS/Ag1RF3UgTeZzFnaSgyB4mTnwj1gLdwQidVcr
2SlL7TffCj0m/bYjtNbwExRqXE4pQKb5RKwYwpruZaX/G3oHWOG9+2X9Pw5C42zB
OFE4KvYUwoV+noabXvil8LERIdKYxR/2B6qBiwm47IcioqM07zTYLHJ+WDTEMO2k
Qy51yXwFmeOer5MIBELYCQ0j2AfI4RCXr+2cyUym7tjEr3/I8EsZ5Crvdf++Gwaz
2A05ScPMr+5yfVXygZCenMTwNAyUY1yN9zVj8/n94Psa
-----์ข…๋ฃŒ ์ฆ๋ช…์„œ--------
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์™„์ „ํžˆ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ป๊ฒŒ ๋“  curl์€ ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘˜ ๋‹ค openssl์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ Python ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ž์ฒด ์„œ๋ช… ์ธ์ฆ ์‚ฌ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

requests.get('https://10.10.24.20', verify='/etc/ssl/certs/certSIGN_ROOT_CA.pem')
์—ญ์ถ”์ (๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰):
ํŒŒ์ผ "", 1ํ–‰, ์—์„œ
ํŒŒ์ผ "/usr/local/lib/python2.7/dist-packages/requests/api.py", 72ํ–‰, get
๋ฐ˜ํ™˜ ์š”์ฒญ('get', url, params=params, *kwargs)์š”์ฒญ ์‹œ ํŒŒ์ผ "/usr/local/lib/python2.7/dist-packages/requests/api.py", 58ํ–‰session.request(๋ฉ”์†Œ๋“œ=๋ฉ”์„œ๋“œ, url=url, * kwargs)๋ฅผ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", 508ํ–‰, ์š”์ฒญ
resp = self.send(์ค€๋น„, *send_kwargs)ํŒŒ์ผ "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", 618ํ–‰, ๋ณด๋‚ด๊ธฐr = adapter.send(์š”์ฒญ, * kwargs)
ํŒŒ์ผ "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", 506ํ–‰, ๋ณด๋‚ด๊ธฐ
SSLError(e, ์š”์ฒญ=์š”์ฒญ) ๋ฐœ์ƒ
requests.exceptions.SSLError: HTTPSConnectionPool(host='10.10.24.20', port=443): ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ ์ดˆ๊ณผ: url: / (Caused by SSLError(SSLError("์ž˜๋ชป๋œ ํ•ธ๋“œ์…ฐ์ดํฌ: Error([('SSL ๋ฃจํ‹ด', 'tls_process_server_certificate)) ', '์ธ์ฆ์„œ ํ™•์ธ ์‹คํŒจ')],)",),))

๋‚ด๊ฐ€ ํ™•์ธ False๋ฅผ ์œ ์ง€ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€๋งŒ verify=True๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ „์— ๋ณด์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด '์š”์ฒญ'์€ verify=False์ธ ๊ฒฝ์šฐ์—๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

$ ํŒŒ์ด์ฌ
Python 2.7.13(๊ธฐ๋ณธ๊ฐ’, 2017๋…„ 1์›” 19์ผ, 14:48:08)
[GCC 6.3.0 20170118] linux2
์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด "๋„์›€๋ง", "์ €์ž‘๊ถŒ", "ํฌ๋ ˆ๋”ง" ๋˜๋Š” "๋ผ์ด์„ผ์Šค"๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.

๊ฐ€์ ธ์˜ค๊ธฐ ์š”์ฒญ
requests.get("https://localhost:9000/getcpuinfo", ํ™•์ธ=๊ฑฐ์ง“)
์—ญ์ถ”์ (๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰):
ํŒŒ์ผ "", 1ํ–‰, ์—์„œ
ํŒŒ์ผ "/usr/lib/python2.7/dist-packages/requests/api.py", 70ํ–‰, get
๋ฐ˜ํ™˜ ์š”์ฒญ('get', url, params=params, *kwargs)์š”์ฒญ ์‹œ ํŒŒ์ผ "/usr/lib/python2.7/dist-packages/requests/api.py", 56ํ–‰session.request(๋ฉ”์†Œ๋“œ=๋ฉ”์„œ๋“œ, url=url, * kwargs)๋ฅผ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ "/usr/lib/python2.7/dist-packages/requests/sessions.py", 488ํ–‰, ์š”์ฒญ
resp = self.send(์ค€๋น„, *send_kwargs)ํŒŒ์ผ "/usr/lib/python2.7/dist-packages/requests/sessions.py", 609ํ–‰, ๋ณด๋‚ด๊ธฐr = adapter.send(์š”์ฒญ, * kwargs)
ํŒŒ์ผ "/usr/lib/python2.7/dist-packages/requests/adapters.py", 497ํ–‰, ๋ณด๋‚ด๊ธฐ
SSLError(e, ์š”์ฒญ=์š”์ฒญ) ๋ฐœ์ƒ
requests.exceptions.SSLError: ("์ž˜๋ชป๋œ ํ•ธ๋“œ์…ฐ์ดํฌ: SysCallError(-1, '์˜ˆ๊ธฐ์น˜ ์•Š์€ EOF')",)

๋‚ด ์ง€์—ญ ์ธ์ฆ์„œ ์ •๋ณด๋Š”,

$ openssl s_client -showcerts -connect localhost:9000
CONNECTED(00000003)
depth=0 CN = localhost
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
write:errno=0
---
Certificate chain
 0 s:/CN=localhost
   i:/CN=localhost
-----BEGIN CERTIFICATE-----
MIIC/jCCAeagAwIBAgIJAKATu2AY/QT4MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
BAMMCWxvY2FsaG9zdDAeFw0xNzExMDkyMTQ1NTBaFw0xNzEyMDkyMTQ1NTBaMBQx
EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAJTPk5nao0wG/EDFGnq7BvXMkEZ5oUVq7PAUxWi+E/byJk924l7Z5kACgWBa
zQL0lLXLpdMk97EFGWMblz5Ehtqh7U8HaE9OZ6x/pesDTka+REnpXecklRrdZHX7
lfFnNIU58grPpB2GyUXrRdOtcPlaKXUo+VTd7PgwMtYVtt8pyTWxSB2MMYrqJGT8
78KX6trRzQLm7tas3U0jD59+R8j7gxU6FyFaNJBrkJ5T9kHGKOsAzSqZdCgRBjl5
i7xcXJfOAAnZ3jhGlY5DQht+HZDHhjkLG9kcZZhFDYteFk8drzbd3lBw96nLq+8A
Sy92FtQL4GiYSwZ0WVAmwmTCGjUCAwEAAaNTMFEwHQYDVR0OBBYEFLYjwGKbcV9h
sYHxe8l9UvXVivByMB8GA1UdIwQYMBaAFLYjwGKbcV9hsYHxe8l9UvXVivByMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHl7okBCJlms+cwfzLhs
sbyyuX2wgngxyvjy497zBmeh1TiueGPhOx9u/sfJSZmoUaeRd/zPGkp2DcPQ+Lo2
EHYrXMPE1Ecgpu/15JZ8jNuE+FwZb9lllULLwzq8pDkdbdsSRltdV/rFlZ2YkscB
c+xvVaCltw5KpKnY6AWHoqwoDcd8TZKzyKXLSuluKbHNC1lvg8cMzs6hFA9P92Ae
9P08AKLAIOGJ7QzRrXQIsAO4p9rHheeZeYQZyNiRrXPQUoWos4+OjynaNs+FabhN
XBtSl/GGPRRRfU/D9v4iKfQx15CEvs1AKn1Z6mIPF05pSqbgIoz2mJBV6UM7e+hz
TRs=
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=localhost
issuer=/CN=localhost
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1198 bytes and written 302 bytes
Verification error: self signed certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 5311B8500C8AF327083E1465FE1E1A6A98E0996B4791150A01D6B130C7F0549909A4BDCDED388E9EDE124BB6C50E150A
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1510599077
    Timeout   : 7200 (sec)
    Verify return code: 18 (self signed certificate)
    Extended master secret: no
---

์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€๋กœ์ฑ„์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์œผ๋กœ ๋ฌธ์ œ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ณ ์ž ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@sg77 ๊ท€ํ•˜์˜ ์ธ์ฆ์„œ๋Š” CA=FALSE ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์–ด ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. curl์ด ์ด ์ธ์ฆ์„œ๋ฅผ ๋ฃจํŠธ CA๊ฐ€ ์•„๋‹Œ ํ•€์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋Š” ๋ฃจํŠธ CA๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CA=TRUE ๋กœ ์ƒˆ ์ธ์ฆ์„œ๋ฅผ ๋ฐœํ–‰ํ•˜๊ฑฐ๋‚˜ BasicConstraints๋ฅผ ์™„์ „ํžˆ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@ashwini-kaklij ์ธ์ฆ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธ์ด ์‹คํŒจํ•œ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜์ง€ ๋งˆ์„ธ์š” . ๋Œ€์‹  StackOverflow์— ์งˆ๋ฌธ์„ ๋ณด๋‚ด์„ธ์š”.

@uttampawar ๊ท€ํ•˜์˜ ์˜ค๋ฅ˜๋Š” ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ TLS ํ•ธ๋“œ ์…ฐ์ดํฌ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์ด ์—†์œผ๋ฉด ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์งˆ๋ฌธ์„ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๊ฐ€์ ธ๊ฐ€์‹ญ์‹œ์˜ค.

@Lukasa ๋ฌธ์ œ๋ฅผ ๋†’์ด๋ ค๋Š” ์˜๋„๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์ด ์ž˜๋ชป๋œ ๊ณณ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ์„ฑ๊ฒฉ์˜ ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์˜๊ฒฌ๊ณผ ๊ด€์ฐฐ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. stackoverflow์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€๋กœ์ฑ„์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์œผ๋กœ ๋ฌธ์ œ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ณ ์ž ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@sg77 ๊ท€ํ•˜์˜ ์ธ์ฆ์„œ๋Š” CA=FALSE ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์–ด ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. curl์ด ์ด ์ธ์ฆ์„œ๋ฅผ ๋ฃจํŠธ CA๊ฐ€ ์•„๋‹Œ ํ•€์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋Š” ๋ฃจํŠธ CA๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CA=TRUE ๋กœ ์ƒˆ ์ธ์ฆ์„œ๋ฅผ ๋ฐœํ–‰ํ•˜๊ฑฐ๋‚˜ BasicConstraints๋ฅผ ์™„์ „ํžˆ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@ashwini-kaklij ์ธ์ฆ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธ์ด ์‹คํŒจํ•œ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. _์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜์ง€ ๋งˆ์„ธ์š”_: ๋Œ€์‹  StackOverflow๋กœ ์งˆ๋ฌธ์„ ๋ณด๋‚ด์„ธ์š”.

@uttampawar ๊ท€ํ•˜์˜ ์˜ค๋ฅ˜๋Š” ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ TLS ํ•ธ๋“œ ์…ฐ์ดํฌ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์ด ์—†์œผ๋ฉด ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์งˆ๋ฌธ์„ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๊ฐ€์ ธ๊ฐ€์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š” Lukasa - ๋ฐฉ๊ธˆ ๋‹ต์žฅ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. @sg77 ์— "๊ท€ํ•˜์˜ ์ธ์ฆ์„œ๊ฐ€ CA=FALSE ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋‹ต์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฑฐ์ง“์ด๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์„ TRUE๋กœ ๋‹ค์‹œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜/๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”.

์ธ์ฆ์„œ ํ‚ค๋ฅผ ์˜จ๋ผ์ธ์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@์‹œ๋‹ˆ๋‹ค

์ธ์ฆ์„œ ํ‚ค๋ฅผ ์˜จ๋ผ์ธ์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Œ, ์•„๋‹ˆ. ์ธ์ฆ์„œ์˜ ๊ฐœ์ธ ํ‚ค ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค์˜ ๋ชจ๋“  CA๋Š” ๋ชจ๋“  ์ฃผ๋ฅ˜ OS ๋ฐ ๋ธŒ๋ผ์šฐ์ €์— ์ธ์ฆ์„œ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ๋ ค์ฃผ๋‚˜์š”?

https://en.wikipedia.org/wiki/Public-key_cryptography

์ด ์˜ค๋ฅ˜๋Š” ์ธ์ฆ์„œ ์ž์ฒด๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์œ ํšจํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. PEM์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ธ์ฆ์„œ ์ž์ฒด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์ธ์ฆ์„œ์— ์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

python requests ๋ชจ๋“ˆ์˜ ์ดˆ๋ณด์ž์ด๊ณ  ๋ณด์•ˆ ์‚ฌ์ดํŠธ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Certificate verify failed ๋ฐ ๋ชจ๋“  ์ดˆ๋ณด์ž ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฉธ๋งํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. auth = session.post( mysecureurl, verify=false) ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋งค์šฐ ๋‚˜์œ ์Šต๊ด€์ด๋ฉฐ ๋งŽ์€ SO ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด ๋‚™๋‹ดํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ดˆ๋ณด์ž๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์˜ค์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
Python(pip) ๋ฐ Conda ๋ฐ ๋ชจ๋“  Python ๊ธฐ๋ฐ˜ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ„๋„์˜ ์ธ์ฆ์„œ ์ €์žฅ์†Œ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Python ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์ฒด CA ํŒŒ์ผ ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์„ค์น˜๋œ ๊ฒฝ์šฐ certifi ํŒจํ‚ค์ง€์˜ ์ธ์ฆ์„œ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ pip๋Š” curl ์™€ ๋‹ฌ๋ฆฌ ์‹œ์Šคํ…œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ requests ์˜ ๊ฒฝ์šฐ conda ๋˜๋Š” pip๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„œ ์ €์žฅ์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tldr;

  1. ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ์ด ๋†€๋ผ์šด ๋ธ”๋กœ๊ทธ ์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  .cer ์ธ์ฝ”๋”ฉ๋œ ์ธ์ฆ์„œ ์ฒด์ธ์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ธ”๋กœ๊ทธ๋Š” conda certstore๊ฐ€ ์•„๋‹ˆ๋ผ git certstore์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ฃจํŠธ๋งŒ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ธ์ฆ์„œ ์ฒด์ธ์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ์œผ๋กœ pip install certifi ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ certifi ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  3. conda ๋˜๋Š” python์˜ ์ธ์ฆ์„œ ์ €์žฅ์†Œ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

import ssl
ssl.get_default_verify_paths() ๋˜๋Š”
import certifi
certifi.where()

  1. ๊ธฐ๋ณธ cacert.pem ํŒŒ์ผ์„ ์ฐพ์•˜์œผ๋ฉด ์ด ํŒŒ์ผ์„ ์—ด๊ณ (๋ฉ”๋ชจ์žฅ++๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค) ํŒŒ์ผ ๋์— ๋ชจ๋“  ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (์ธ์ฆ์„œ ๊ตฌ๋ถ„ -----BEGIN CERTIFICATE----- ๋ฐ -----END CERTIFICATE----- ). ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    ๋˜๋Š” conda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ conda ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
    conda config --set ssl_verify <pathToYourFile>.crt
    (๋‚˜๋Š” ์ด ๋ช…๋ น์ด C:\Users\johndoe\.condarc ์˜ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค)

  2. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    import certifi
    auth = session.post('https://mysecuresite.com/', cert=());

๋˜ํ•œ Linux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋งํฌ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ cacert๋ฅผ ์‹œ์Šคํ…œ ์ „์ฒด ๋˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœํ•„( .bashrc ๋˜๋Š” .bash_profile )๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

thadeusb picture thadeusb  ยท  3์ฝ”๋ฉ˜ํŠธ

xsren picture xsren  ยท  3์ฝ”๋ฉ˜ํŠธ

Matt3o12 picture Matt3o12  ยท  3์ฝ”๋ฉ˜ํŠธ

remram44 picture remram44  ยท  4์ฝ”๋ฉ˜ํŠธ

NoahCardoza picture NoahCardoza  ยท  4์ฝ”๋ฉ˜ํŠธ