2012-02-01 16 views
15

私は、クライアントブラウザにcertをインストールする必要があるアプリを書いています。私はこれを "Context"オブジェクトのPyOpenSSLドキュメントで見つけましたが、何とかコールバックが証明書を検証する方法については何も見えません。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. 

は、私は私の(自己署名)Contextオブジェクトを言っている鍵である(下記参照)ので、ライブラリをチェックするために、私はそれが十分ではない理由を私は理解していないと思う場合は、クライアントによって提示された証明書有効なものです。このコールバック関数では、何をすべきですか?

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

警告:それはSSLに来るとき、私のQは私の総跛行、認識の甘さ、および/または理解の基本的な欠如を明らかにするので、もしDEF、ここでの楽しみのためにプロのないコーディングあまりにもラフにならないでください!

感謝:)

ロジャー

答えて

6

set_verify()ためOpenSSL documentationでは、あなたが気に鍵がリターンコードです:

コールバックは5つの引数取る必要があります。接続オブジェクト、X509 オブジェクト、3つの整数変数、潜在的に誤差があります 番号、エラー深さ、戻りコード。検証が合格した場合は を返し、それ以外の場合はfalseを返します。 When are client certificates verified?

は基本的に、あなたは最初の4つの引数を無視することができ、ちょうどのような5番目の引数には、戻りコードの値を確認してください。あなたが何をしたいか、多かれ少なかれ示しAAの完全実施例はあり

そう:

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

注:私はあなたがすべての読み込み記号の前にSSL.接頭辞を持っていないので、私はそれをテストしている間に、あなたのコードビットを簡素化するfrom OpenSSL.SSL import ...ある一つの他の変更を行いました。

関連する問題