2016-03-30 9 views
0

My Sentryインスタンスは、クライアント側の証明書を使用して認証する必要があるプロキシの背後にあります。 Ravenを使用するTwistedアプリケーションをこのプロキシを正常に通過させるにはどうすればよいですか? raven.transport.Transportに何も表示されないので、クライアント証明書、鍵および信頼チェーンを指定することができます。私の選択肢は何ですか?Raven Twisted integrationのSSLオプション

答えて

0

OK、見つかりました。最もクリーンなソリューションではありませんが、機能します。

カスタムスキームで独自のトランスポートクラスを登録することができます。

https://url/project?client_cert=f1&client_key=f2 

など:クライアントの秘密(証明書、キー、チェーン)で、この作品を作るために、あなたは次のように、歩哨DSNのURLにクエリパラメータとしてそれらを指定する必要があります。これらのパラメータは、kwargsでTransportコンストラクタに渡されます。 。ツイストVで16.0.0これは次のようになります。あなたは今、自分自身を定義することができ、これらのコンポーネントで

def make_agent(reactor, policy=None): 
    kw = {} 
    if policy is not None: 
     kw['contextFactory'] = policy 
    return Agent(reactor, pool=HTTPConnectionPool(reactor), **kw) 

class InstancePolicy(BrowserLikePolicyForHTTPS): 

    def __init__(self, trustRoot=None, 
      client_cert=None, client_key=None, client_trust_chain=None, 
      server_ca_cert=None): 
     if None in (client_cert, client_key): 
      raise ValueError('When using client side SSL both certificate and key are required') 
     super(InstancePolicy, self).__init__(trustRoot) 
     self.client_cert_file = client_cert 
     self.client_key_file = client_key 
     self.client_trust_chain_file = client_trust_chain 
     self.server_ca_cert_file = server_ca_cert 

    @property 
    def trust_source(self): 
     src = self._trustRoot 
     if self.server_ca_cert_file is not None: 
      src = ssl.Certificate.loadPEM(FilePath(self.server_ca_cert_file).getContent()) 
     return src 

    def creatorForNetloc(self, hostname, port): 
     if self.client_cert_file is not None: 
      key_pair = ssl.KeyPair.load(FilePath(self.client_key_file).getContent(), crypto.FILETYPE_PEM) 
      client_cert = ssl.PrivateCertificate.load(FilePath(self.client_cert_file).getContent(), 
       key_pair, crypto.FILETYPE_PEM) 
     else: 
      client_cert = None 
     extra = {} 
     if self.client_trust_chain_file is not None: 
      chain = [ssl.Certificate.loadPEM(str(x)) for x in pem.parse_file(self.client_trust_chain_file)] 
      extra['extraCertificateOptions'] = dict(extraCertChain=[x.original for x in chain]) 
     return ssl.optionsForClientTLS(
      hostname.decode('ascii'), 
      trustRoot=self.trust_source, 
      clientCertificate=client_cert, 
      **extra 
     ) 

は、次に、あなたの好みに合わせてエージェントのインスタンスを構築するために、次の機能を使用することができます交通サブクラス:

class TwistedHTTPSClientSSLTransport(TwistedHTTPTransport): 
    scheme = ['twisted_clientssl+https'] 

    def __init__(self, parsed_url, *args, **kwargs): 
     client_cert = kwargs.pop('client_cert', None) 
     client_key = kwargs.pop('client_key', None) 
     client_trust_chain = kwargs.pop('client_trust_chain', None) 
     server_ca_cert = kwargs.pop('server_ca_cert', None) 
     super(TwistedHTTPSClientSSLTransport, self).__init__(parsed_url, *args, **kwargs) 
     policy = InstancePolicy(client_cert=client_cert, 
      client_key=client_key, client_trust_chain=client_trust_chain, 
      server_ca_cert=server_ca_cert) 
     from twisted.internet import reactor 
     self._agent = make_agent(reactor, policy) 

今、あなたはあなたのカスタムスキームのためのあなたの交通のクラスを登録することができレイヴンクライアントのインスタンスを作成する前に:

for sc in TwistedHTTPSClientSSLTransport.scheme: 
    Client.register_scheme(sc, TwistedHTTPSClientSSLTransport) 

これは機能します。