【问题标题】:Same public key differs with the way to get it相同的公钥不同获取方式不同
【发布时间】:2021-04-06 14:27:36
【问题描述】:

我正在编写一个使用 SSL 套接字的小程序。客户端将值发送到服务器,当服务器获得值时,它会检查客户端的公钥以确保他应该发送一些东西。因此,起初服务器会像这样获取所有公钥:

       cert = f.read()
       crtObj = crypto.load_certificate(crypto.FILETYPE_PEM, cert)
       pubKeyObject = crtObj.get_pubkey()
       pubKeyString = crypto.dump_publickey(crypto.FILETYPE_PEM,pubKeyObject)

使用这种方法,公钥是:

B'----- BEGIN PUBLIC KEY ----- \ nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7GIzek5JgfFzFCGwnx7X \ ncE4QULV / 9uyoGgd9HbHYyYcItEcSPU39ORXCrNQGxh09k4oFPBYntjD2gIORF8V4 \ n6EAC10bFaT18OuM1F / 37V + K / + + BuvCDTqcS9Y0CRalwPFVYB yttvZ8fnvO2l / TxF的\ nsLmZh0yY / ajaHxey / ppUQycGy4xA8XD6VlWFM7 + I0t / 19rrLN9iMFSym / TgYpBbn \ nxyZel8rMW/ACS09nSprEu1BuI+myhhej+cuy3wU8byRTwANpqHxsx5cTwp642TVx\nBKbuO8GHAzEKcrFZnrKcsXr9emWV5ouYiVzehOT4Pd3I2W8qSy6x/Ovv/iS3ojT4\ndQIDQAB\n-----结束公钥-----

当服务器想像这样从套接字连接中获取它时:

       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 1AbGHT2TigU8Fie2MPaAg5EXxXjoQALXRsVpPXw64zUX/fu/4r/4G68INOpxL1jQ JFqXA8VVgH7K229nx+e87aX9PEWwuZmHTJj9qNofF7L+mlRDJwbLjEDxcPpWVYUz v4jS3/X2uss32IwVLKb9OBikFufHJl6Xysxb8AJLT2dKmsS7UG4j6bKGF6P5y7Lf BTxvJFPAA2mofGzHlxPCnrjZNXEEpu47wYcDMQpysVmespyxev16ZZXmi5iJXN6E 5Pg93cjZbypLLrH86++/+JLeiNPh1AgMBAAE= -----结束公钥-----

所以我不知道这是否是格式问题,或者它是否真的不是我得到的同一个公钥......但它应该是。 很抱歉发了这么长的帖子,非常感谢您的阅读。

【问题讨论】:

    标签: python ssl openssl cryptography rsa


    【解决方案1】:

    大多数(如果不是全部)base64 编码变体使用 A-Z、a-z、0-9 字符来表示数据,总数为 62 个字符,一些 base64 编码在最后 2 个字符中有所不同,但大多数使用 + 和 @987654322 @ 这将完成 64。所以上面的 2 个键似乎完全不同,第二个键也被填充,因为 = 符号在末尾。标准的 base64 编码是 RFC 4648 变体,它使用 +/ 并将填充作为可选而不是像 RFC 4880 openpgp base64 编码那样强制。

    【讨论】:

    • 好的,谢谢,您知道为什么我没有得到相同的密钥吗?
    • @LoLoVoulzy 刚刚查看了您似乎将第二个公钥内容解码为ASCII 的代码。这将使内容被解码为 ASCII,而第一个密钥被解码为 Base64 数据。您可以尝试更改读取其中一个键的方式以匹配另一个键。
    【解决方案2】:

    实际上是相同的键,但获取它的方式是错误的:这里是来自 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)
    

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2020-06-12
      • 2010-10-16
      • 2023-02-07
      相关资源
      最近更新 更多