私は現在、公開鍵に基づいて現在のクライアントを認証するPythonサーバースクリプトを作成しようとしています。ツイストを使用しているので、ツイストドキュメンテーションの例から始めました。
サンプルコードを使用してキーを生成し、接続して通信することはできますが、クライアントの公開キーを使用可能な形式で取得する方法はまだ見つかりません。このスタック交換の質問では、誰かがオブジェクトから公開鍵を抽出しOpenSSL.crypto.PKey
ますが、それを読み取り可能な形式に変換することはできません。メソッド内またはプロトコルの任意のメソッドを介しPKey
てx509証明書のオブジェクトにアクセスできるので、これは良い方法です。(受け入れられない)答えは試してみることを示唆しています。残念ながら、これは実際には期待される結果をもたらしません。答えのとは簡単なテキスト置換関数で修正できますが、base64文字列は公開鍵と一致しないようです。公開鍵を抽出しましたverifyCallback
self.transport.getPeerCertificate()
crypto.dump_privatekey(PKey)
BEGIN PRIVATE KEY
BEGIN PRIVATE KEY
openssl rsa -in client.key -pubout > client.pub
ここで述べたように。関数の結果と一致しませんdump_privatekey
。
ランチパッドのOpenSSLに対する未解決のバグはまだありますが、まだ修正されていません。これは19か月前に報告されたもので、最近(2012年10月)のアクティビティがいくつかあります。リポジトリが迅速に修正される見込みはありません。
client.pub
上記のファイルに匹敵する形式で公開鍵を取得する方法について、他に何かアイデアはありますか?おそらく、この情報を保持するツイストまたはOpenSSL接続固有のオブジェクトがあります。後でアクセスできるように、公開鍵をプロトコルオブジェクトに保存する必要があることに注意してください。
なぜ回答が受け入れられないのですか?
JFセバスティアンによるM2Crypto
申し訳ありませんが、証明書を接続に関連付けることができない可能性については考えていませんでした。プロトコルインスタンス内に公開鍵を保存する必要があるという要件を追加しました。したがって、 JFセバスティアンによって提案されpeerX509.as_pem()
た関数内での使用はpostConnectionCheck
機能しません。さらに、少なくともpython-m2cryptoのバージョン0.21.1-2ubuntu3ではpeerX509.get_rsa().as_pem()
、正しい公開鍵を取得するために呼び出す必要があります。peerX509.as_pem(None)
(パスフレーズが必要なため)を使用peerX509.as_pem()
すると、PyOpenSSLとまったく同じ出力が得られcrypto.dump_privatekey(PKey)
ます。たぶんバグがあります。
Echo
これに加えて、答えは私に次のプロトコルクラスを使用することによって別の回避策を書くための可能な方法を示しました:
class Echo(Protocol):
def dataReceived(self, data):
"""As soon as any data is received, write it back."""
if self.transport.checked and not self.pubkeyStored:
self.pubkeyStored = True
x509 = m2.ssl_get_peer_cert(self.transport.ssl._ptr())
if x509 is not None:
x509 = X509.X509(x509, 1)
pk = x509.get_pubkey()
self.pubkey = pk.get_rsa().as_pem()
print pk.as_pem(None)
print self.pubkey
self.transport.write(data)
ご覧のとおり、これは防止したいいくつかの内部クラスを使用しています。M2Crypto.SSL.TwistedProtocolWrappergetCert
のクラスにメソッドを追加する小さなパッチを提出するのをためらっています。TLSProtocolWrapper
それがアップストリームで受け入れられたとしても、それは私のスクリプトとm2cryptoの最も最先端のバージョン以外のバージョンとの互換性を壊してしまいます。あなたならどうしますか?
私による外部OpenSSL呼び出し
まあ、それは外部システムコマンドに基づく醜い回避策であり、非公開の属性にアクセスするよりもさらに悪いように思えます。