2013-06-12 1 views
7

OS X 용 응용 프로그램을 개발 중입니다. 응용 프로그램은 보안 연결을 사용하여 python 요청을 통해 서버와 통신합니다.OS X로 패키징 할 때 요청시 SSLError 요청 .app

패키지로 만들 파이썬 파일을 실행할 수 있으며 SSL 연결에 성공합니다.

Traceback (most recent call last): 
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/__boot__.py", line 338, in <module> 
    _run() 
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/__boot__.py", line 333, in _run 
    exec(compile(source, path, 'exec'), globals(), globals()) 
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/media_test.py", line 16, in <module> 
    cmpbl.syncWithCloud() 
File "src/compare_book_lists.pyc", line 172, in syncWithCloud 
File "src/compare_book_lists.pyc", line 64, in checkMediaOnCloud 
File "src/get_cloud_book_list.pyc", line 26, in getCloudFulfilledBookList 
File "requests/api.pyc", line 55, in get 
File "requests/api.pyc", line 44, in request 
File "requests/sessions.pyc", line 354, in request 
File "requests/sessions.pyc", line 460, in send 
File "requests/adapters.pyc", line 250, in send 
requests.exceptions.SSLError: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib 
2013-06-12 11:39:49.119 drunken-octo[1656:707] drunken-octo Error 

내가 성공적으로 내 응용 프로그램의 일부를 포장 할 수 있었다 : 나는 py2app으로 파일을 패키징하고 그것을 실행하려고 할 때, 나는 다음과 같은 오류가 발생합니다. 문제는 대상 파일이 체인의 어딘가에 요청에 의존 할 때 시작됩니다.

zc.buildout을 사용하여 가져 오기를 구성하고 있습니다. 따라서 빌드 아웃으로 작성된 로컬 파이썬 인터프리터에서 실행 중이므로 불행히도 시스템 파이썬을 수정하지 않아도 구현하기가 쉽습니다. 그러나 모든 제안을 환영하며, 세부 사항을 수정하기 위해 최선을 다할 것입니다.

패키지 앱을 실행하는 경우에만 발생합니다. 어떤 아이디어?

답변

6

easiests 해결 방법은 setup.py 파일에 py2app에 대한 옵션을 추가하는 것입니다

setup(
    ... 
    options={ 
     'py2app':{ 
      'packages': [ 'requests' ] 
     } 
    } 
) 

이 인증서 번들을 포함하는 응용 프로그램 번들로 전체 패키지가 포함되어 있습니다.

issue for this in my py2app tracker을 제출 했으므로 향후 버전의 py2app에는 요청 라이브러리의 사용을 감지하는 논리가 포함되며 자동으로 인증서 번들이 복사됩니다.

+0

안녕하십니까.이 해결 방법은 더 이상 작동하지 않는 것 같습니다. py2app에 대한 업데이트 소식이 있습니까? 감사! –

3

요청은 서버 ID를 확인하기 위해 인증서 모음을 사용합니다. 이 번들은 독립적 인 파일에 보관됩니다 (반드시 있어야 함). 일반적으로 요청은 자체 번들과 함께 제공되지만 단일 파일로 패키지화하면 번들이 손실됩니다. 앱과 함께 새 번들을 발송하거나 시스템 전체 인증서를 요청할 수 있습니다. 요청 파일이이 작업을 수행 할 수 있습니다 기대 경우,

보려면 (나는 그것의 /etc/ssl/certs/ca-certificates.crt는 OS X가이 파일을 유지 곳, 알고 있지만, 내 리눅스 상자하지 않음) :

import requests 
print(requests.certs.where()) 

은을 변경하려면 요청이 번들을 찾습니다 위치는, 당신은 문자열 값으로 verify -parameter을 전달할 수 있습니다

import requests 
requests.get("https://httpbin.org/", verify="path/to/your/bundle") 

당신은 매개 변수마다 시간을 통과 세션을 만들고 번들을 사용하도록 구성하지 않으려면 :

import requests 
s = requests.Session() 
s.verify = "path/to/your/bundle" 
s.get("https://httpbin.org") 
3

이전에 수락 된 답변이 나에게 적합하지 않았습니다. 요청한 방식이 변경되었을 수도 있습니다.

OPTIONS = {'argv_emulation': True,'packages': ['certifi']} 

그런 다음 파이썬 요청이 추가 호출 :

is_py2app = hasattr(sys, "frozen") 
pem_path = "lib/python2.7/certifi/cacert.pem" if is_py2app else None 

... 

requests.get(..., verify=pem_path) 

이를 인증서 PEM 파일이 사는 곳

이 문제를 해결하려면 나는 certifi 패키지를 포함하는 내 setup.py 옵션을 변경 다른 Python 버전에서는 다를 수 있습니다.

+0

예, 이것은 제 패키지의 중요한 단계였습니다. 감사 eAi – Jon

+0

참고로 기본적으로 내 요청 패키지는'cacert.pem'에 대해 자체 패키지가 아니라'certifi' 패키지를 사용하고 있었지만'certifi'는 열린 폴더가 아닌 site-package.zip에있었습니다. 대안은 가'''pem_path = "lib 디렉토리/python2.7/요청/cacert.pem"is_py2app 다른 없음 ''' 요청 (certifi을 필요로하지와 함께 패키지 하나를 사용하지하는 경우를 추가 할 수 있습니다). 그러나 그것은 내가 상상하는 작은 차이를 만든다. – Jon

+0

안녕하세요 @ eAi 바보 같은 질문이라면 유감입니다. 하지만 is_py2app = hasattr (sys, "frozen")'줄에'sys' 란 무엇입니까? –

0

동일한 문제가 발생하여 Mac에 설치된 Python이나 certifi 패키지가없는 사용자에게 내 응용 프로그램을 배포해야했습니다. 여기에서 대답의 영감을 그리며 다음 해결책을 찾았습니다.

1 단계 : https://www.openssl.org/source/에서 OpenSSL 패키지를 다운로드하십시오. /openssl-1.0.2n/certs/demo/ca-cert.pem을 찾아 파이썬 프로그램과 동일한 디렉토리에 넣으십시오 (예 : main.py).

2 단계 : 평소와 같이 setup.py을 만들고 DATA_FILES 목록에 ca-cert.pem을 포함시킵니다.

from setuptools import setup 

APP = ['main.py'] 
DATA_FILES = ['ca-cert.pem'] 
OPTIONS = {'argv_emulation': False} 

setup(
    app=APP, 
    data_files=DATA_FILES, 
    options={'py2app': OPTIONS}, 
    setup_requires=['py2app'], 
) 

3 단계 : 요청이 사용자가 제공 한 인증서 파일을 사용할 수 있도록 verify 매개 변수를 사용 그래서 setup.py는 다음과 같이 보일 것입니다. 당신이 verify마다 시간을 지정하지 않도록

import requests 
requests.get("https://httpbin.org/", verify="ca-cert.pem") 

또는, 당신은 또한 세션을 생성 할 수 있습니다.

import requests 
s = requests.Session() 
s.verify = "ca-cert.pem" 
s.get("https://httpbin.org") 

4 단계 : 평소처럼 py2app를 사용하여 응용 프로그램을 패키지화하십시오. 결과 앱이 정상적으로 실행될 수 있어야합니다.

python setup.py py2app 
관련 문제