2017-11-24 2 views
2

을 사용하여 클라이언트 쪽에서 ssl-certificate를 확인할 수 없습니다.이 질문은 중복입니다. 그러나 나는 주어진 답에서 어떤 해결책도 찾지 못하기 때문에 여전히 묻고있다. 그래서 사람들은 중복되지 않고 대신이 문제를 해결하는 데 도움이됩니다.은 파이썬 요청, httplib/httplib2, urllib/urlib2

병 (붙여 넣기)을 사용하여 https로 서버를 실행 중입니다. java 및 postman에서 액세스하려고하면 올바르게 검증되고 응답이옵니다. 사용

버전 : 파이썬 2.7.13

요청. 버전 '2.11.1' 수입 암호 암호 법. 버전 '2.1.3' 가져 오기 OpenSSL OpenSSL. 버전 '17 .3.0 '

하지만 불행히도 파이썬 모듈의 액세스를 시도 할 때 -이 문제를 던지고. ?

requests.post(url, verify=_certfile, proxies=proxies) #tried #failed to verify certificate 

urllib2.urlopen(url, data=data, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, 
     cafile=None, capath=None, cadefault=False, context=context) #tried #failed to verify certificate 

import httplib2 

http = httplib2.Http(disable_ssl_certificate_validation=True) 
headers, content = http.request(url, "POST", body=data, headers=headers)#tried #failed to verify certificate 

httplib.HTTPSConnection(host='10.201.41.50', port=8018, key_file=key_file, cert_file=cert_file, strict=None, context=context) #tried #failed to verify certificate 

내 서버는 병 프레임 워크를 사용하여 붙여 넣기 서버를 사용하여 실행 중입니다. (각 lib 디렉토리와 다른) 내가 직면하고

ssl_cxt = SSL.Context(SSL.SSLv23_METHOD) 
... 
... 
ssl_cxt.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb) 
paste.httpserver.serve(app, host=IP, port=PORT, server_version=" ", ssl_context=ssl_cxt) 

문제

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "Continuum\Anaconda2\lib\site-packages\requests\api.py", line 70, in get 
return request('get', url, params=params, **kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\api.py", line 56, in request 
return session.request(method=method, url=url, **kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\sessions.py", line 475, in request 
resp = self.send(prep, **send_kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\sessions.py", line 596, in send 
r = adapter.send(request, **kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\adapters.py", line 497, in send 
raise SSLError(e, request=request) 
requests.exceptions.SSLError: unknown error (_ssl.c:2947) 

============

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "Continuum\Anaconda2\lib\site-packages\requests\api.py", line 70, in get 
return request('get', url, params=params, **kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\api.py", line 56, in request 
return session.request(method=method, url=url, **kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\sessions.py", line 475, in request 
resp = self.send(prep, **send_kwargs) 
File "Continuum\Anaconda2\lib\site-packages\requests\sessions.py", line 596, in send 
r = adapter.send(request, **kwargs) 
File "Continuum\Anaconda2\lib\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:661) 

    File "Continuum\Anaconda2\lib\httplib.py", line 1038, in endheaders 
    self._send_output(message_body) 
    File "Continuum\Anaconda2\lib\httplib.py", line 882, in _send_output 
    self.send(msg) 
    File "Continuum\Anaconda2\lib\httplib.py", line 844, in send 
    self.connect() 
    File "Continuum\Anaconda2\lib\httplib.py", line 1262, in connect 
    self.sock = self._context.wrap_socket(self.sock, 
    AttributeError: 'Context' object has no attribute 'wrap_socket' 

답변

2

나는, urllib2가를 사용하여 해결하기 위해 시도 소켓 및 SSL. 나는 서버를 칠 수있다. 나는 .pkcs12로 시도했지만 urllib2는 .pem 파일 만 기대합니다. 그래서 파이썬에서 액세스하려고 할 때 특히 .pem 확장자를 가진 클라이언트 인증서를 만들려고합니다.

import ssl 
import socket 
import urllib2 
import json 


url = "https://localhost:port/hello/" 

_certfile_pem = "ssl_client.pem" 
key_file = "ssl_key.pem" 
cert_file = "ssl_cert.pem" 

headers = {"Content-Type":"application/json"} 
data = {} 

context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
context.verify_mode = ssl.CERT_REQUIRED 
context.load_cert_chain(certfile=cert_file, keyfile=key_file) 
context.load_verify_locations(_certfile_pem) 
context.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) # 
socket overwrite required. 

try: 
    req = urllib2.Request(url,data=json.dumps(data)) 
    response = urllib2.urlopen(req, context=context) 
    content = response.read() 
    print content 
except urllib2.HTTPError as e: 
    content = e.read() 
    print "HTTPError : ", e