2012-02-01 38 views
15

Tôi đang viết một ứng dụng yêu cầu phải cài đặt chứng chỉ trong trình duyệt của khách hàng. Tôi đã tìm thấy điều này trong các tài liệu PyOpenSSL cho đối tượng "Context" nhưng tôi không thể thấy bất cứ điều gì về cách gọi lại là nghĩa vụ phải xác nhận cert, chỉ có nó nên, bằng cách nào đó.Xác thực chứng chỉ ứng dụng khách trong PyOpenSSL

 
    set_verify(mode, callback) 
     Set the verification flags for this Context object to mode and 
     specify that callback should be used for verification callbacks. 
     mode should be one of VERIFY_NONE and VERIFY_PEER. If 
     VERIFY_PEER is used, mode can be OR:ed with 
     VERIFY_FAIL_IF_NO_PEER_CERT and VERIFY_CLIENT_ONCE to further 
     control the behaviour. callback should take five arguments: A 
     Connection object, an X509 object, and three integer variables, 
     which are in turn potential error number, error depth and return 
     code. callback should return true if verification passes and 
     false otherwise. 

Tôi đang nói với đối tượng Ngữ cảnh nơi các phím (tự ký) của tôi là (xem bên dưới) vì vậy tôi đoán tôi không hiểu tại sao điều đó không đủ để thư viện kiểm tra xem chứng nhận của khách hàng là một giá trị hợp lệ. Bạn nên làm gì trong chức năng gọi lại này?

class SecureAJAXServer(PlainAJAXServer): 
    def __init__(self, server_address, HandlerClass): 
     BaseServer.__init__(self, server_address, HandlerClass) 
     ctx = SSL.Context(SSL.SSLv23_METHOD) 
     ctx.use_privatekey_file ('keys/server.key') 
     ctx.use_certificate_file('keys/server.crt') 
     ctx.set_session_id("My_experimental_AJAX_Server") 
     ctx.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT | SSL.VERIFY_CLIENT_ONCE, callback_func) 
     self.socket = SSL.Connection(ctx, socket.socket(self.address_family, self.socket_type)) 
     self.server_bind() 
     self.server_activate() 

Lưu ý: Mã hóa để giải trí ở đây, không phải là chuyên gia vì vậy nếu Q của tôi cho thấy sự thiếu hiểu biết, thiếu hiểu biết và cơ bản của tôi khi nói đến SSL, đừng quá thô lỗ!

Cảm ơn :)

Roger

Trả lời

6

Trong OpenSSL documentation cho set_verify(), chìa khóa mà bạn quan tâm là mã trở:

callback nên lấy năm lập luận: Một Đối tượng kết nối, một đối tượng X509 và ba biến số nguyên, lần lượt là lỗi tiềm năng số, độ sâu lỗi và mã trả lại. gọi lại phải trả lại đúng nếu xác minh được chuyển và sai khác.

Có aa dụ làm việc đầy đủ cho thấy nhiều hơn hoặc ít hơn những gì bạn muốn làm: When are client certificates verified?

Về cơ bản, bạn có thể bỏ qua 4 đối số đầu tiên và chỉ cần kiểm tra giá trị của mã trở lại trong đối số thứ như vậy:

from OpenSSL.SSL import Context, Connection, SSLv23_METHOD 
from OpenSSL.SSL import VERIFY_PEER, VERIFY_FAIL_IF_NO_PEER_CERT, VERIFY_CLIENT_ONCE 

class SecureAJAXServer(BaseServer): 
    def verify_callback(connection, x509, errnum, errdepth, ok): 
     if not ok: 
      print "Bad Certs" 
     else: 
      print "Certs are fine" 
     return ok 

    def __init__(self, server_address, HandlerClass): 
     BaseServer.__init__(self, server_address, HandlerClass) 
     ctx = Context(SSLv23_METHOD) 
     ctx.use_privatekey_file ('keys/server.key') 
     ctx.use_certificate_file('keys/server.crt') 
     ctx.set_session_id("My_experimental_AJAX_Server") 
     ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT | VERIFY_CLIENT_ONCE, verify_callback) 
     self.socket = Connection(ctx, socket.socket(self.address_family, self.socket_type)) 
     self.server_bind() 
     self.server_activate() 

Lưu ý: tôi đã thực hiện một sự thay đổi khác đó là from OpenSSL.SSL import ... để đơn giản hóa mã của bạn một chút trong khi tôi đang thử nghiệm nó, do đó bạn không có tiền tố SSL. trước mọi ký tự nhập khẩu.

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