2010-04-13 2 views
5

PKCS # 12 인증서를 사용하여 클라이언트 유효성 검사에 httplib의 HTTPSConnection을 사용하려고합니다. 나는 인증서가 MSIE와 Firefox에서 그것을 사용하는 서버에 연결할 수 있기 때문에 인증서가 좋다는 것을 안다.PKCS # 12 인증서로 httlib의 HTTPSConnection을 사용하는 중 오류가 발생했습니다.

내 연결 기능은 인증서에 개인 키가 포함되어 있습니다. 난 그냥 기본에 내려 껍질을 벗겼다했습니다

def connect(self, cert_file, host, usrname, passwd): 
    self.cert_file = cert_file 
    self.host = host 

    self.conn = httplib.HTTPSConnection(host=self.host, port=self.port, key_file=cert_file, cert_file=cert_file) 

    self.conn.putrequest('GET', 'pathnet/,DanaInfo=200.222.1.1+') 
    self.conn.endheaders() 
    retCreateCon = self.conn.getresponse() 

    if is_verbose: 
     print "Create HTTPS connection, " + retCreateCon.read() 

(참고 : 하드 코딩 된 경로에 대한 코멘트, 제발 -이 먼저 일을하려고 노력하지거야, 나는 꽤 나중에 그것을 만들 수 있습니다 . 하드 코딩 된 경로는 MSIE 및 Firefox에서 연결될 때 정확합니다. 게시물의 IP 주소를 변경했습니다.

PKCS # 12 인증서 (.pfx 파일), 나는 openSSL 오류로 보이는 것을 다시 얻는다. 여기에 전체 오류 추적은 다음과 같습니다

 
    File "Usinghttplib_Test.py", line 175, in 
    t.connect(cert_file=opts["-keys"], host=host_name, usrname=opts["-username"], passwd=opts["-password"]) 
    File "Usinghttplib_Test.py", line 40, in connect 
    self.conn.endheaders() 
    File "c:\python26\lib\httplib.py", line 904, in endheaders 
    self._send_output() 
    File "c:\python26\lib\httplib.py", line 776, in _send_output 
    self.send(msg) 
    File "c:\python26\lib\httplib.py", line 735, in send 
    self.connect() 
    File "c:\python26\lib\httplib.py", line 1112, in connect 
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) 
    File "c:\python26\lib\ssl.py", line 350, in wrap_socket 
    suppress_ragged_eofs=suppress_ragged_eofs) 
    File "c:\python26\lib\ssl.py", line 113, in __init__ 
    cert_reqs, ssl_version, ca_certs) ssl.SSLError: [Errno 336265225] _ssl.c:337: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib 

공지 사항,에는 OpenSSL 오류 (목록의 마지막 항목) 나는 PEM 인증서를 사용하려고하고 있지 않다 때문에 나는 이상한 발견 "PEM lib 디렉토리"를 말한다.

킥의 경우 PKCS # 12 인증서를 PEM 인증서로 변환하고 을 사용하여 동일한 코드를 실행했습니다. 이 경우 오류가 발생하지 않고 PEM 암호 구문을 입력하라는 메시지가 나타나고 코드가 서버에 도달하려고 시도했습니다. (나는 "이 서비스는 을 사용할 수 없습니다. 나중에 다시 시도하십시오.",하지만 서버가 PEM 인증서를 수락하지 않았기 때문에 그럴 것이라고 생각합니다 .PEM cert를 사용하여 Firefox에서 서버에 연결할 수 없습니다.)

httplib의 HTTPSConnection이 PCKS # 12 인증서를 지원해야합니까? (즉, pfx 파일입니다.) 그렇다면 openSSL이 PEM 라이브러리 안에로드하려고하는 것처럼 보이는 이유는 무엇입니까? 이 모든 일을 잘못하고 있니?

어떤 조언을 환영합니다.

EDIT : 인증서 파일에는 인증서와 개인 키가 모두 포함되어 있습니다. 따라서 HTTPSConnection의 key_file 및 cert_file 매개 변수에 동일한 파일 이름을 제공하고 있습니다.

답변

4

openSSL 메일 링리스트에서 Mounir Idrassi와 채팅했습니다. 그는 openSSL이 PKCS # 12 파일을 지원하며, 내가받는 오류 메시지를 기반으로 httplib가 잘못된 기능을 호출하여 키를로드하는 것처럼 보입니다. . 당신이 점점 오류에 관한

는 "당신이 사용하고있는 phython 모듈은 PKCS에게 그것을 # 12 파일 이름을 제공하여 SSL_CTX_use_PrivateKey_file를 호출하는 것 같습니다 이것은

는 SSL_CTX_use_PrivateKey_file 만 수락하지 않기 때문에 그의 말에

두 가지 형식 : SSL_FILETYPE_PEM 및 SSL_FILETYPE_ASN1. "

(이 파일 형식은 인증서와 같은 파일에서 개인 키를 모두 포함하기 때문에 나는 키 파일로 PKCS # 12 파일 이름을 HTTPLIB주는거야.)

을 "이 문제를 해결하기 위해, 당신은 - PEM 파일에 개인 키가 들어있는 python 모듈을 제공하십시오.- 또는 위의 PKCS # 12 함수를 사용하여이 비단뱀 모듈의 소스 코드를 수정하여 개인 키를 EVP_PKEY를 실행 한 다음 SSL_Cuse_certificate와 함께 SSL_CTX_use_PrivateKey_file 대신 SSL_use_PrivateKey를 호출하여 관련 인증서를 설정하십시오."

는 (나는 이전을 시도하고 작동시킬 수 없습니다 반드시 작동하지 않습니다 것을 의미하지 않는다. 내가 할 수 없습니다 만 것이다.) 이것은 놀라운 일이 아니다

4

. 파이썬 라이브러리 참조 문서는 이것에 대해 매우 분명 http://docs.python.org/library/httplib.html에서 :.

클래스 HTTPLIB HTTPSConnection (호스트 [포트 [, KEY_FILE [cert_file [엄격한 [타임 아웃 [source_address]]]. ]]])

보안 서버와의 통신에 SSL을 사용하는 HTTPConnection의 하위 클래스입니다. 기본 포트는 443입니다. key_file은 PEM 형식의 개인 키가 포함 된 파일의 이름입니다. cert_file은 이며 PEM 형식의 인증서 체인 파일입니다.

+0

+1 RTFM의 경우. 작년에 내가이 일을하고있을 때 너 어디 있었 니? :) –

+0

안녕하세요 레미, 나는 마크에서 조금 느려졌습니다 ;-) - 나는 상당히 새로운 편입니다. 비슷한 오류 문자열을 검색하는 게시물을 발견했습니다. 내가 전화 체인을 따라 어딘가에서 인수 명령을 엉망으로 만들고 핵심 경로를 httplib에 전달하지 않은 것으로 드러났다. – Blairo