My Sentryインスタンスは、クライアント側の証明書を使用して認証する必要があるプロキシの背後にあります。 Ravenを使用するTwistedアプリケーションをこのプロキシを正常に通過させるにはどうすればよいですか? raven.transport.Transportに何も表示されないので、クライアント証明書、鍵および信頼チェーンを指定することができます。私の選択肢は何ですか?Raven Twisted integrationのSSLオプション
0
A
答えて
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)
これは機能します。
関連する問題
- 1. Mongo Vs Raven評価
- 2. python twisted elasticsearch connections
- 3. Twisted callRemote
- 4. Raven db System.InvalidCastException:at at Raven.Client.Document.InMemoryDocumentSessionOperations.TrackEntity [T]
- 5. Python3 Twisted Mysql Error
- 6. Screw Twisted ConnectionLost error
- 7. Iron Python Twisted
- 8. Twisted custom CancelledError
- 9. Socket.IO vs. Twisted
- 10. python twisted cred use
- 11. Twisted dataReceived hangs
- 12. Python Twisted sendLine()
- 13. comet、cometd、twisted、websync