pyOpenSSL - Как проверить E CC (сертификат Elipti c Curve) - OpenSSL.crypto.Error: [('ellipti c процедуры кривой', 'i2d_ECPrivateKey', 'E C lib')] - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующий код, который отлично проверяет обычные сертификаты:

from Crypto.Util import asn1                                                                                            
from OpenSSL import crypto 
...
class OpenSSL(object):                                                                                                  
     def get_modulus(self, key_object):                                                                                  
         key_asn1 = crypto.dump_privatekey(crypto.FILETYPE_ASN1,                                                         
                                           key_object)                                                                   
         key_der = asn1.DerSequence()                                                                                    
         key_der.decode(key_asn1)                                                                                        
         return key_der[1]  # DerSequence is (key_type, modulus, ...)                                                    

     def validate_certificate(self, certificate):                                                                        
         is_valid, modulus = True, None                                                                                  
         try:                                                                                                            
             cert_object = crypto.load_certificate(crypto.FILETYPE_PEM,                                                  
                                                   certificate)                                                          
         except crypto.Error as e:                                                                                       
             logger.debug('Invalid certificate! %s', e)                                                                  
             is_valid = False                                                                                            
         else:                                                                                                           
             publickey_object = cert_object.get_pubkey()                                                                 
             modulus = self.get_modulus(publickey_object)                                                                

         return (is_valid, modulus)
...

Но когда я запускаю этот код с E CC (Elipti c Curve Certificate), я получаю следующую ошибку :

>>> from myfile import OpenSSL
>>> openssl_instance = OpenSSL()
>>> with open("certificate.pem") as file:
...     data = file.read()
... 
>>> openssl_instance.validate_certificate(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "myfile.py", line 99, in validate_certificate
    modulus = self.get_modulus(publickey_object)
  File "myfile.py", line 84, in get_modulus
    key_object)
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/crypto.py", line 1905, in dump_privatekey
    _openssl_assert(result_code != 0)
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/_util.py", line 67, in openssl_assert
    exception_from_error_queue(error)
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/_util.py", line 54, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.crypto.Error: [('elliptic curve routines', 'i2d_ECPrivateKey', 'EC lib')] 

Может кто-нибудь сказать мне, как я должен / мог бы подтвердить сертификат E CC? Возможно, это ошибка в библиотеке pyOpenSSL? Сегодня я использую pyOpenSSL версии 16.2.0, но обновление до последней версии (19.1.0) не решило проблему. Не самый опытный человек с крипто / сертификатами, поэтому, если возможно, сообщите подробности, как будто я не работал с ИТ. Спасибо!

...