2010-04-13 39 views
5

Tôi đang cố sử dụng HTTPSConnection của httplib để xác thực ứng dụng khách, bằng chứng chỉ PKCS # 12. Tôi biết giấy chứng nhận là tốt, vì tôi có thể kết nối với máy chủ bằng cách sử dụng nó trong MSIE và Firefox.Lỗi khi sử dụng HTTPSConnection của httlib với chứng chỉ PKCS # 12

Đây là chức năng kết nối của tôi (chứng chỉ bao gồm khóa riêng). Tôi đã pared nó xuống để chỉ những điều cơ bản:

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() 

(Lưu ý: Không có nhận xét trên con đường mã hóa cứng, xin vui lòng - Tôi đang cố gắng để có được điều này để làm việc đầu tiên, tôi sẽ làm cho nó khá sau Đường dẫn mã hoá cứng là chính xác, khi tôi kết nối với nó trong MSIE và Firefox. Tôi đã thay đổi địa chỉ IP cho bài đăng.)

Khi tôi cố gắng chạy bằng chứng chỉ PKCS # 12 (tệp .pfx), Tôi lấy lại những gì dường như là một lỗi openSSL. Dưới đây là lỗi toàn bộ traceback:

 
    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 

Thông báo, lỗi OpenSSL (mục cuối cùng trong danh sách) lưu ý "PEM lib", mà tôi tìm thấy lẻ, vì tôi không cố gắng sử dụng một giấy chứng nhận PEM.

Đối với các cú đá, tôi đã chuyển đổi chứng chỉ PKCS # 12 thành chứng chỉ PEM và chạy cùng mã sử dụng rằng. Trong trường hợp đó, tôi đã không nhận được lỗi, tôi đã được nhắc nhập cụm từ mật khẩu PEM và mã đã cố gắng truy cập vào máy chủ. (Tôi đã nhận được phản hồi "Dịch vụ không phải là khả dụng. Vui lòng thử lại sau.", Nhưng tôi tin rằng đó là vì máy chủ không chấp nhận chứng chỉ PEM. Tôi không thể kết nối trong Firefox với máy chủ bằng chứng chỉ PEM hoặc.)

HTTPSConnection của httplib có nghĩa vụ hỗ trợ chứng chỉ PCKS # 12 không? (Tức là, các tệp pfx.) Nếu vậy, tại sao nó trông giống như openSSL đang cố tải nó bên trong lib PEM? Tôi có làm điều này sai không?

Mọi lời khuyên đều được chào đón.

EDIT: Tệp chứng chỉ chứa cả chứng chỉ và khóa cá nhân, đó là lý do tại sao tôi cung cấp cùng tên tệp cho cả thông số key_file và cert_file của HTTPSConnection.

Trả lời

4

Trên danh sách gửi thư openSSL, tôi đã trò chuyện với Mounir Idrassi. Ông lưu ý rằng openSSL không hỗ trợ tệp PKCS # 12 và - dựa trên thông báo lỗi tôi nhận được - có vẻ như httplib đang gọi hàm sai để tải khóa.

Nói cách của mình:.

"Liên quan đến lỗi mà bạn đang nhận được, có vẻ như các mô-đun Phython bạn đang sử dụng được gọi SSL_CTX_use_PrivateKey_file bằng cách cho nó trở thành PKCS tên file # 12 Đây là không vì SSL_CTX_use_PrivateKey_file chỉ chấp nhận hai định dạng: SSL_FILETYPE_PEM và SSL_FILETYPE_ASN1. "

(tôi cho httplib tên file PKCS # 12 như tập tin quan trọng, bởi vì định dạng tập tin này bao gồm cả các CERT và khóa riêng trong cùng một tập tin.)

"Để sửa lỗi này, bạn có hai giải pháp: - Hoặc nạp mô-đun python với khóa riêng trong tệp PEM - Hoặc sửa đổi mã nguồn của mô-đun python này để sử dụng các hàm PKCS # 12 mà tôi đã đề cập ở trên để trích xuất khóa riêng dưới dạng EVP_PKEY và sau đó gọi SSL_use_PrivateKey thay vì SSL_CTX_use_PrivateKey_file, cùng với SSL_use_certificate để thiết lập chứng chỉ liên quan."

(Tôi đã thử trước đây và đã không thể có được nó để làm việc không nhất thiết có nghĩa là nó sẽ không làm việc;. Duy nhất mà tôi đã không thể.)

4

Đây là không có bất ngờ . Các tài liệu tham khảo thư viện Python là khá rõ ràng về vấn đề này Từ http://docs.python.org/library/httplib.html:.

lớp httplib HTTPSConnection (host [, cổng [, key_file [, cert_file [, nghiêm ngặt [, thời gian chờ [, source_address]]]. ]]])

Một phân lớp của HTTPConnection sử dụng SSL để giao tiếp với các máy chủ bảo mật. Cổng mặc định là 443. key_file là tên của PEM được định dạng tệp có chứa khóa riêng của bạn. cert_file là PEM được định dạng tệp chuỗi chứng chỉ.

+0

+1 cho RTFM. Bạn đã ở đâu năm ngoái khi tôi đang làm việc này? :) –

+0

Xin chào Remi, tôi đã hơi chậm đánh dấu ;-) - Tôi khá mới đối với SO. Chỉ cần đi qua bài viết của bạn tìm kiếm trên một chuỗi lỗi tương tự. Hóa ra tôi đã chỉ xáo trộn trật tự đối số ở đâu đó dọc theo chuỗi cuộc gọi và không bao giờ thông qua con đường chính vào httplib. – Blairo

Các vấn đề liên quan