【问题标题】:Getting Public Key from a .pfx Certficate in Python从 Python 中的 .pfx 证书获取公钥
【发布时间】:2018-05-01 21:16:45
【问题描述】:

我这样做是为了处理 pfx 证书,方法是写出一个 pem 文件。

我怎样才能同时取出 public_key?我注意到 p12 对象没有 get_publickey() 方法。

import contextlib
import OpenSSL.crypto
import os
import requests
import ssl
import tempfile
pfx_password = 'thiscertpassword' 
tpem = 'temppem.pem' 
pfxfile = 'fts.pfx' 


f_pem = open(tpem, 'wb')
pfx = open(pfxfile, 'rb').read()
p12 = OpenSSL.crypto.load_pkcs12(pfx, pfx_password)

f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, 
p12.get_privatekey()))
#f_pem.write(OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM,  
p12.get_publickey()))  # NO SUCH METHOD 
f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, 
p12.get_certificate()))

【问题讨论】:

    标签: python google-cloud-platform public-key-encryption pem pfx


    【解决方案1】:

    提取适合写入文件或用于进一步处理(例如验证 Signed-JWT)的公钥的示例代码。重要的一点是公钥是从证书中提取的。

    我将此代码用于 Google 服务帐户 P12 凭据。

    此代码生成的公钥如下所示:

    b'-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFDEADbeefMIIBCgKCAQEA5vFQucW2JW2WBhLI3dB0\n8OIkgCJPJDxoJ65kphmFSB2ZWsejV/iSecoIBYLyD2+HdHJm8pUgOOy05lm07gei\n0BRqLNYtUk2nlQIMoLPXxv23+VOWdpN/mYUsRhRwB13Aq4BybxObq+c7b08YWitI\nEtPmSEv+YkKlpcGzQcfctT7GNjjBqWuUuM1dxAqJll6JIEGAWEsDeTh9YOqnBnRb\nAWxI62D9/9bVnLkRWv0S9gfOZLuboVBhBSbHQyjbeefDeAd1J6nToug7wdxC66r1\n55lLzf9Ow9KPlsj30d6Alv59xX9QEU3MfIEfyxGiIHNTX6g8A3XUHOtgdmDyVB//\nXwIDAQAB\n-----END PUBLIC KEY-----\n'
    

    Python 3.x 代码:

    import OpenSSL.crypto
    
    def load_public_key(pfx_path, pfx_password):
            ''' Read the public key and return as PEM encoded '''
    
            # print('Opening:', pfx_path)
            with open(pfx_path, 'rb') as f:
                    pfx_data = f.read()
    
            # print('Loading PFX contents:')
            pfx = OpenSSL.crypto.load_pkcs12(pfx_data, pfx_password)
    
            public_key = OpenSSL.crypto.dump_publickey(
                    OpenSSL.crypto.FILETYPE_PEM,
                    pfx.get_certificate().get_pubkey())   # Change to pfx.
    
            print(public_key)
    
            return public_key
    

    【讨论】:

    • 得到:openssl.py:17: DeprecationWarning: str for passphrase is no longer accepted, use bytes
    • @OmarGonzales - 创建一个新问题并包含您的代码。快速回答,使用字节而不是字符串作为密码值。示例:b"my-password"
    • 我已经发布了一个问题,请访问:stackoverflow.com/questions/59563615/…
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多