我有以下脚本。它连接到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>
答案 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)