Python 同一公钥的获取方式不同
我正在使用SSL套接字编写一个小程序。客户机向服务器发送值,当服务器获取该值时,它会检查客户机的公钥,以确保客户机需要发送某些内容。因此,首先服务器将获得所有公钥,如下所示:Python 同一公钥的获取方式不同,python,ssl,openssl,cryptography,rsa,Python,Ssl,Openssl,Cryptography,Rsa,我正在使用SSL套接字编写一个小程序。客户机向服务器发送值,当服务器获取该值时,它会检查客户机的公钥,以确保客户机需要发送某些内容。因此,首先服务器将获得所有公钥,如下所示: cert = f.read() crtObj = crypto.load_certificate(crypto.FILETYPE_PEM, cert) pubKeyObject = crtObj.get_pubkey() pubKeyString = crypto.d
cert = f.read()
crtObj = crypto.load_certificate(crypto.FILETYPE_PEM, cert)
pubKeyObject = crtObj.get_pubkey()
pubKeyString = crypto.dump_publickey(crypto.FILETYPE_PEM,pubKeyObject)
test1 = writer.get_extra_info('ssl_object')
der =test1.getpeercert(binary_form=True)
test = test1.getpeercert()
cert = x509.Certificate.load(der)
pubkey= cert.public_key.unwrap()
print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))
使用此方法,公钥为:
b'----开始公开2.重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点,重点YRTWANPQHXSX5CTWP642Tvx\nBKbuO8GHAZEKCRFZNRKCSxR9EMWV5OUYIVZEHOT4PI2W8QSY6X/Ovv/iS3ojT4\ndQIDAQAB-----结束公钥------\n'
当服务器希望从套接字连接获取它时,如下所示:
cert = f.read()
crtObj = crypto.load_certificate(crypto.FILETYPE_PEM, cert)
pubKeyObject = crtObj.get_pubkey()
pubKeyString = crypto.dump_publickey(crypto.FILETYPE_PEM,pubKeyObject)
test1 = writer.get_extra_info('ssl_object')
der =test1.getpeercert(binary_form=True)
test = test1.getpeercert()
cert = x509.Certificate.load(der)
pubkey= cert.public_key.unwrap()
print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))
打印的公钥是:
-----开始公钥-----
AoIBAQDsYjN6TkmB8XMUIbCfHtdwThBQtX/27KgaB30dsdjJhwi0RxI9Tf05FcKs
图8FIE2MPAAG5EXXXJOQALXRSVPXW64ZUX/fu/4r/4G68INOpxL1jQ
JFqXA8VVgH7K229nx+e87aX9PEWwuZmHTJj9qNofF7L+mlRDJwbLjEDxcPpWVYUz
v4jS3/X2USS32IWVLKB9OBIKFUFHJL6XYSXB8AJLT2DKMS7UG4J6BKGF6P5Y7LF
BTxVJFPAA2MOfGzHlxCnRjzNxEpU47WYCdMQPYSVMESPyXeV16ZZxMI5IJxN6E
5PG93CJZbyplRH86+/+JLeiNPh1AgMBAAE=
-----结束公钥-----
所以我不知道这是否是一个格式问题,或者它是否真的不是我得到的同一个公钥。。。但应该是这样。
很抱歉写了这么长的文章,非常感谢您的阅读。大多数(如果不是全部的话)base64编码变体使用A-Z、A-Z、0-9个字符来表示数据。总共是62个字符,一些base64编码在最后2个字符中有所不同,但大多数使用
+
和/
,这将完成64个字符。因此,上述两个键似乎完全不同,第二个键也被填充,因为末尾有=
符号。标准的base64编码是RFC4648
变体,它使用+
和/
并使填充成为可选的,而不像RFC4880OpenPGP
base64编码那样是强制性的。它实际上是相同的密钥,但获取它的方式是错误的:这里是来自ssl对象的正确密钥:
test1 = writer.get_extra_info('ssl_object')
der =test1.getpeercert(binary_form=True)
crtObj = crypto.load_certificate(crypto.FILETYPE_ASN1, der)
pubKeyObject = crtObj.get_pubkey()
pubKeyString = crypto.dump_publickey(crypto.FILETYPE_PEM, pubKeyObject)
好的,谢谢你,你知道我为什么没有得到相同的密钥吗?@LoLoVoulzy刚刚看了一下代码,你似乎将第二个公钥内容解码为
ASCII
。这将使内容被解码为ASCII,而第一个键被解码为Base64数据。您可以尝试更改读取其中一个键的方式,以匹配另一个键。