์ฌ๋ณด์ธ์. 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).
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 ๋ฐ ๋ธ๋ผ์ฐ์ ์ ์ธ์ฆ์๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ๋ชจ๋ ์ฌ๋์๊ฒ ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ ค์ฃผ๋์?
์ด ์ค๋ฅ๋ ์ธ์ฆ์ ์์ฒด๊ฐ ์ด๋ค ์์ผ๋ก๋ ์ ํจํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ํ์คํฉ๋๋ค. 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;
.cer
์ธ์ฝ๋ฉ๋ ์ธ์ฆ์ ์ฒด์ธ์ ๋ด๋ณด๋
๋๋ค. ์ฐธ๊ณ ๋ก ๋ธ๋ก๊ทธ๋ conda certstore๊ฐ ์๋๋ผ git certstore์ ๊ดํ ๊ฒ์ด๋ฉฐ ๋ฃจํธ๋ง ๋ด๋ณด๋
๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ธ์ฆ์ ์ฒด์ธ์ ๋ณ๋์ ํ์ผ๋ก ๋ด๋ณด๋์ต๋๋ค.pip install certifi
๋ช
๋ น์ ์ฌ์ฉํ์ฌ certifi
๋ฅผ ์ค์นํฉ๋๋ค.import ssl
ssl.get_default_verify_paths()
๋๋
import certifi
certifi.where()
๊ธฐ๋ณธ cacert.pem
ํ์ผ์ ์ฐพ์์ผ๋ฉด ์ด ํ์ผ์ ์ด๊ณ (๋ฉ๋ชจ์ฅ++๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค) ํ์ผ ๋์ ๋ชจ๋ ์ธ์ฆ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. (์ธ์ฆ์ ๊ตฌ๋ถ -----BEGIN CERTIFICATE-----
๋ฐ -----END CERTIFICATE-----
). ํ์ผ์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
๋๋ conda๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ conda ๋ช
๋ น์ ์ฌ์ฉํ์ญ์์ค.
conda config --set ssl_verify <pathToYourFile>.crt
(๋๋ ์ด ๋ช
๋ น์ด C:\Users\johndoe\.condarc
์ ๋ด์ฉ์ ์
๋ฐ์ดํธํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค)
์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ์ญ์์ค.
import certifi
auth = session.post('https://mysecuresite.com/', cert=());
๋ํ Linux๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋งํฌ ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ cacert๋ฅผ ์์คํ
์ ์ฒด ๋๋ ์ฌ์ฉ์ ํ๋กํ( .bashrc
๋๋ .bash_profile
)๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
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;
.cer
์ธ์ฝ๋ฉ๋ ์ธ์ฆ์ ์ฒด์ธ์ ๋ด๋ณด๋ ๋๋ค. ์ฐธ๊ณ ๋ก ๋ธ๋ก๊ทธ๋ conda certstore๊ฐ ์๋๋ผ git certstore์ ๊ดํ ๊ฒ์ด๋ฉฐ ๋ฃจํธ๋ง ๋ด๋ณด๋ ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ธ์ฆ์ ์ฒด์ธ์ ๋ณ๋์ ํ์ผ๋ก ๋ด๋ณด๋์ต๋๋ค.pip install certifi
๋ช ๋ น์ ์ฌ์ฉํ์ฌcertifi
๋ฅผ ์ค์นํฉ๋๋ค.import ssl
ssl.get_default_verify_paths()
๋๋import certifi
certifi.where()
๊ธฐ๋ณธ
cacert.pem
ํ์ผ์ ์ฐพ์์ผ๋ฉด ์ด ํ์ผ์ ์ด๊ณ (๋ฉ๋ชจ์ฅ++๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค) ํ์ผ ๋์ ๋ชจ๋ ์ธ์ฆ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. (์ธ์ฆ์ ๊ตฌ๋ถ-----BEGIN CERTIFICATE-----
๋ฐ-----END CERTIFICATE-----
). ํ์ผ์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.๋๋ conda๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ conda ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค.
conda config --set ssl_verify <pathToYourFile>.crt
(๋๋ ์ด ๋ช ๋ น์ด
C:\Users\johndoe\.condarc
์ ๋ด์ฉ์ ์ ๋ฐ์ดํธํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค)์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ์ญ์์ค.
import certifi
auth = session.post('https://mysecuresite.com/', cert=());
๋ํ Linux๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋งํฌ ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ cacert๋ฅผ ์์คํ ์ ์ฒด ๋๋ ์ฌ์ฉ์ ํ๋กํ(
.bashrc
๋๋.bash_profile
)๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.