Python 同一公钥的获取方式不同

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

我正在使用SSL套接字编写一个小程序。客户机向服务器发送值,当服务器获取该值时,它会检查客户机的公钥,以确保客户机需要发送某些内容。因此,首先服务器将获得所有公钥,如下所示:

       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数据。您可以尝试更改读取其中一个键的方式,以匹配另一个键。