2016-12-17 34 views
1

私は以下のスクリプトを持っています。 TLSサーバーに接続し、X509証明書の公開鍵を抽出します。Pythonのx509証明書からRSA公開鍵を取り出す方法

import socket, ssl 
import OpenSSL 

hostname='www.google.com' 
port=443 

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
ssl_sock = context.wrap_socket(s, server_hostname=hostname) 
ssl_sock.connect((hostname, port)) 
ssl_sock.close() 
print("ssl connection Done") 

cert = ssl.get_server_certificate((hostname, port)) 
# OpenSSL 
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) 
pk = x509.get_pubkey() 
print(pk) 

問題は返された公開鍵です。私は16進形式でそれを必要とします。この問題を解決するには?

これは私が取得しています出力されます:

<OpenSSL.crypto.PKey object at 0x0000019EBFDF73C8> 
+0

[証明書から公開鍵を抽出してデータを暗号化する]の可能な複製(http://stackoverflow.com/questions/5789193/extracting-public-key-from-certificate-and-encrypting-data) –

+0

現在あなたは公開鍵のハンドルを取得するだけです。あなたは 'OpenSSL.crypto.dump_publickey(type、pkey)'を見ましたか? –

答えて

0

私はあなたが求めているかを正確にはわかりません。受け取った出力を貼り付けると便利です(忘れてしまったようです)。これは、あなたが探しているものハチないかもしれませんが、それは試してみる(また、あなたがimport binascii必要があり、テストされていない)の価値がある:

print(binascii.hexlify(pk.to_cryptography_key().public_key().public_bytes(Encoding.DER, PublicFormat.SubjectPublicKeyInfo)) 

あなたは、あなたのニーズに合わせてエンコードと形式を変更する必要があります。

EDIT:あなたは今何をしようとしているのか分かります。エンコードをEncoding.PKCS1に変更したい場合があります。

+0

出力を追加しました。しかし、私は長い16進形式を見据えています。たとえば、ブラウザから、私はGoogleの公開鍵が次のようなものだと分かります: 'b3 37 8b a7 5e d2 f3 b2 77 90 9e 05 a3 a4 a8 df 99 f0 98 61 f3 95 73 75 9e 6e 11 00 33 7f 5e 23 d1 88 79 eb db c1 04 11 70 e8 5b ee ce a1 5a 90 eb 18 36 5a 48 54 19 e7 8a 7a 92 ec a9 c5 5c 98 ..etc' – user2192774

+0

回線が機能​​していません。例えば、 'Encoding'は未解決です。 – user2192774

関連する問題