簡體   English   中英

如何從python中的x509證書中提取RSA公鑰

[英]How to extract RSA public-key from x509 certificate in python

我有以下腳本。 它連接到 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>

我不確定你要問什么。 粘貼您收到的輸出會很有幫助(看起來您忘記了)。 這可能不是您想要的,但值得一試(未經測試,您還必須import binascii ):

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

您應該修改編碼和格式以滿足您的需要。

編輯:我想我明白你現在想要做什么。 您可能希望將編碼更改為Encoding.PKCS1

#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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM