如何从python中的x509证书中提取RSA公钥

时间:2016-12-17 13:49:57

标签: python ssl cryptography x509

我有以下脚本。它连接到TLS服务器并提取X509证书公钥:

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)

问题是返回的公钥。我需要十六进制格式。如何解决这个问题?

这是我得到的输出:

<OpenSSL.crypto.PKey object at 0x0000019EBFDF73C8>

2 个答案:

答案 0 :(得分:0)

我不确定你要求的是什么。粘贴您收到的输出会很有帮助(看起来您忘记了)。这可能不是你想要的,但它值得一试(未经测试,你也必须min() arg is an empty sequence):

import binascii

您应该修改编码和格式以满足您的需求。

编辑:我想我明白你现在要做的是什么。您可能希望将编码更改为print(binascii.hexlify(pk.to_cryptography_key().public_key().public_bytes(Encoding.DER, PublicFormat.SubjectPublicKeyInfo))

答案 1 :(得分:0)

#pk = x509.get_pubkey() # from your code.
IntPk = pk.to_cryptography_key().public_numbers()
print(IntPk.n)# modulus
print(IntPk.e)# exponent

在python3中,默认为任意精度算法。 因此解密是可能的,如下所示:

pow(signature, e, n))# (a**b)%c is by pow(a, b, c)
相关问题