2017-07-14 9 views
0

PythonでアンドロイドAPKのCERT.RSAを解析したいと思います。 私はそれがpyOpenSSLpyOpenSSLのPKCS7オブジェクトは、ほとんど情報を提供しません。署名内の公開鍵のsha1ダイジェストを得るにはどうすればいいですか?

import OpenSSL 

証明書= OpenSSL.crypto.load_certificateで解析することができます知っている(OpenSSL.crypto.FILETYPE_ASN1、 オープン( 'CERT.RSA'、 'RB')。(読み))

cert = OpenSSL.crypto.load_pkcs7_data(type, buffer) 

証明書は「OpenSSL.crypto.PKCS7」タイプです。

ただし、PKCS7オブジェクトは完全ではありません。必要な属性を取得できません。そのファイルを解析する別の方法はありますか?

+1

あなたはどんな属性をお探しですか? –

+0

署名内に公開鍵のsha1ダイジェストが必要です。 – kkzxak47

+0

@stovfl PKCS12と比較して、PKCS7にはほとんど属性と方法がありません。 解析できるように別の形式に変換する方法があるかどうかわかりません。 [pyopenssleドキュメント](https://pyopenssl.readthedocs.io/en/latest/api/crypto.html#pkcs7-objects) PKCS7はPKCS7オブジェクトは以下のメソッド持つオブジェクト: PKCS7.type_is_signedを() FIXME PKCS7.type_is_enveloped() FIXME PKCS7.type_is_signedAndEnveloped() FIXME PKCS7.type_is_data() FIXME PKCS7.get_type_name() PKCS7の型名を取得します。 – kkzxak47

答えて

0

コメント:あなたがopensslを使用してPEMPKCS#7に変換することができます

を解析することができるように、別の形式に変換する方法があるかどうかはわからない、PEMPyOpenSSLを使用して読み取り可能です

openssl pkcs7 -print_certs -in sample.p7b -out sample.cer 

質問:...私はそれがプル要求からコードをUseing 2015
いるので、プルリクエストstallesを実装していない

署名に公開キーのSHA1ダイジェストを取得する方法あなたはできます。

から:のGitHub pyca/pyopenssl: implement getters for pkcs#7 certificates, crl's, and data #367

def get_certificates(self): 
     from OpenSSL.crypto import _lib, _ffi, X509 
     """ 
     https://github.com/pyca/pyopenssl/pull/367/files#r67300900 

     Returns all certificates for the PKCS7 structure, if present. Only 
     objects of type ``signedData`` or ``signedAndEnvelopedData`` can embed 
     certificates. 

     :return: The certificates in the PKCS7, or :const:`None` if 
      there are none. 
     :rtype: :class:`tuple` of :class:`X509` or :const:`None` 
     """ 
     certs = _ffi.NULL 
     if self.type_is_signed(): 
      certs = self._pkcs7.d.sign.cert 
     elif self.type_is_signedAndEnveloped(): 
      certs = self._pkcs7.d.signed_and_enveloped.cert 

     pycerts = [] 
     for i in range(_lib.sk_X509_num(certs)): 
      pycert = X509.__new__(X509) 
      pycert._x509 = _lib.sk_X509_value(certs, i) 
      pycerts.append(pycert) 

     if not pycerts: 
      return None 
     return tuple(pycerts) 

用途:

pkcs7 = crypto.load_pkcs7_data(crypto.FILETYPE_ASN1, open('signature.der', 'rb').read()) 
certs = get_certificates(pkcs7) 
print(certs) 
for cert in certs: 
    print('digest:{}'.format(cert.digest('sha256'))) 

出力:Pythonのでテスト

(<OpenSSL.crypto.X509 object at 0xf671b62c>, <OpenSSL.crypto.X509 object at 0xf671b86c>) 
digest:b'48:19:A4:2A:56:94:22:14:73:EC:2B:01:45:9E:0B:87:92:44:26:5E:57:AF:59:F5:4C:89:F3:79:83:14:11:A3' 
digest:b'25:BC:AC:86:8F:51:8B:EE:47:CC:8B:A7:78:91:7E:86:09:56:19:4B:B9:C4:10:1B:DF:13:CA:A6:54:E1:F7:4C' 

:3.4.2 - OpenSSLの:17.1.0 - 暗号化:1.9 - cffi:1.10.0


使用

OpenSSL.crypto.load_pkcs7_data(type, buffer) 

文字列bufからpkcs7データをロードします。タイプ・タイプでコード化されています。
タイプタイプは、FILETYPE_PEMまたはFILETYPE_ASN1のいずれかでなければなりません)。

+0

私の悪いです。 はい、コマンドはこのコマンドでなければなりません。 戻り値は 'OpenSSL.crypto.PKCS7'です 公開鍵のsha1ダイジェストを取得するにはどうすればよいですか? – kkzxak47

関連する問題