Firmar con fiel en formato PEM
This commit is contained in:
commit
350e11333c
|
@ -1,5 +1,11 @@
|
||||||
# Lista de cambios
|
# Lista de cambios
|
||||||
|
|
||||||
## v 0.1.0
|
|
||||||
|
## v 0.2.0 [15-Jul-21]
|
||||||
|
---
|
||||||
|
* Se agrega la posibilidad de firmar con fiel en formato PEM
|
||||||
|
|
||||||
|
|
||||||
|
## v 0.1.0 [15-Jul-21]
|
||||||
---
|
---
|
||||||
* Primera versión funcional de la descarga masiva
|
* Primera versión funcional de la descarga masiva
|
||||||
|
|
|
@ -19,11 +19,12 @@ from conf import TOKEN
|
||||||
|
|
||||||
class SATCertificate(object):
|
class SATCertificate(object):
|
||||||
|
|
||||||
def __init__(self, cer=b'', key=b'', password=''):
|
def __init__(self, cer=b'', key=b'', pem='', password=''):
|
||||||
self._error = ''
|
self._error = ''
|
||||||
self._init_values()
|
self._init_values()
|
||||||
self._get_data_cer(cer)
|
self._get_data_cer(cer)
|
||||||
self._get_data_key(key, password)
|
self._get_data_key(key, password)
|
||||||
|
self._get_data_pem(pem)
|
||||||
|
|
||||||
def _init_values(self):
|
def _init_values(self):
|
||||||
self._rfc = ''
|
self._rfc = ''
|
||||||
|
@ -131,6 +132,11 @@ class SATCertificate(object):
|
||||||
)
|
)
|
||||||
return key_pem
|
return key_pem
|
||||||
|
|
||||||
|
def _get_data_pem(self, pem):
|
||||||
|
self._key_pem = serialization.load_pem_private_key(
|
||||||
|
pem, None, backend=default_backend())
|
||||||
|
return
|
||||||
|
|
||||||
# Not work
|
# Not work
|
||||||
def _get_p12(self):
|
def _get_p12(self):
|
||||||
obj = serialization.pkcs12.serialize_key_and_certificates('test',
|
obj = serialization.pkcs12.serialize_key_and_certificates('test',
|
||||||
|
@ -144,7 +150,19 @@ class SATCertificate(object):
|
||||||
firma = private_key.sign(data, padding.PKCS1v15(), hashes.SHA256())
|
firma = private_key.sign(data, padding.PKCS1v15(), hashes.SHA256())
|
||||||
return base64.b64encode(firma).decode()
|
return base64.b64encode(firma).decode()
|
||||||
|
|
||||||
|
def _sign_with_pem(self, data, name_hash):
|
||||||
|
if name_hash == 'sha256':
|
||||||
|
type_hash = hashes.SHA256()
|
||||||
|
elif name_hash == 'sha1':
|
||||||
|
type_hash = hashes.SHA1()
|
||||||
|
|
||||||
|
firma = self._key_pem.sign(data, padding.PKCS1v15(), type_hash)
|
||||||
|
return base64.b64encode(firma).decode()
|
||||||
|
|
||||||
def sign_sha1(self, data, password=''):
|
def sign_sha1(self, data, password=''):
|
||||||
|
if self._key_pem:
|
||||||
|
return self._sign_with_pem(data, 'sha1')
|
||||||
|
|
||||||
private_key = self._get_key(password)
|
private_key = self._get_key(password)
|
||||||
firma = private_key.sign(data, padding.PKCS1v15(), hashes.SHA1())
|
firma = private_key.sign(data, padding.PKCS1v15(), hashes.SHA1())
|
||||||
return base64.b64encode(firma).decode()
|
return base64.b64encode(firma).decode()
|
||||||
|
|
|
@ -33,7 +33,7 @@ def join(*paths):
|
||||||
return Path(paths[0]).joinpath(*paths[1:])
|
return Path(paths[0]).joinpath(*paths[1:])
|
||||||
|
|
||||||
|
|
||||||
def _validate_fiel_args(args):
|
def _validate_fiel_args(args, need_key=False):
|
||||||
fiel_path = args.fiel_dir
|
fiel_path = args.fiel_dir
|
||||||
fiel_name = args.fiel_nombre
|
fiel_name = args.fiel_nombre
|
||||||
|
|
||||||
|
@ -50,14 +50,15 @@ def _validate_fiel_args(args):
|
||||||
path_cer = join(fiel_path, f'{fiel_name}.cer')
|
path_cer = join(fiel_path, f'{fiel_name}.cer')
|
||||||
path_key = join(fiel_path, f'{fiel_name}.key')
|
path_key = join(fiel_path, f'{fiel_name}.key')
|
||||||
path_enc = join(fiel_path, f'{fiel_name}.enc')
|
path_enc = join(fiel_path, f'{fiel_name}.enc')
|
||||||
|
path_pem = join(fiel_path, f'{fiel_name}.pem')
|
||||||
|
|
||||||
if not path_cer.is_file():
|
if not path_cer.is_file():
|
||||||
msg = f'No se encontró el archivo CER. \nRuta: {path_cer}'
|
msg = f'No se encontró el archivo CER. \nRuta: {path_cer}'
|
||||||
log.error(msg)
|
log.error(msg)
|
||||||
return False, {}
|
return False, {}
|
||||||
|
|
||||||
if not path_key.is_file():
|
if need_key and not path_key.is_file():
|
||||||
msg = f'No se encontró el archivo KEY. \nRuta: {path_cer}'
|
msg = f'No se encontró el archivo KEY. \nRuta: {path_key}'
|
||||||
log.error(msg)
|
log.error(msg)
|
||||||
return False, {}
|
return False, {}
|
||||||
|
|
||||||
|
@ -65,12 +66,13 @@ def _validate_fiel_args(args):
|
||||||
'path_cer': path_cer,
|
'path_cer': path_cer,
|
||||||
'path_key': path_key,
|
'path_key': path_key,
|
||||||
'path_enc': path_enc,
|
'path_enc': path_enc,
|
||||||
|
'path_pem': path_pem,
|
||||||
}
|
}
|
||||||
return True, data
|
return True, data
|
||||||
|
|
||||||
|
|
||||||
def fiel_validar(args):
|
def fiel_validar(args):
|
||||||
result, data = _validate_fiel_args(args)
|
result, data = _validate_fiel_args(args, True)
|
||||||
if not result:
|
if not result:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -82,7 +84,7 @@ def fiel_validar(args):
|
||||||
|
|
||||||
cer = data['path_cer'].read_bytes()
|
cer = data['path_cer'].read_bytes()
|
||||||
key = data['path_key'].read_bytes()
|
key = data['path_key'].read_bytes()
|
||||||
cert = SATCertificate(cer, key, password)
|
cert = SATCertificate(cer, key, password=password)
|
||||||
|
|
||||||
if cert.error:
|
if cert.error:
|
||||||
msg = f'{cert.error}\n\nNo podrás conectarte el SAT.'
|
msg = f'{cert.error}\n\nNo podrás conectarte el SAT.'
|
||||||
|
@ -110,19 +112,32 @@ def base_datos():
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def _get_cert(data):
|
||||||
|
key = b''
|
||||||
|
pem = b''
|
||||||
|
cer = data['path_cer'].read_bytes()
|
||||||
|
if data['path_enc'].is_file():
|
||||||
|
key = data['path_enc'].read_bytes()
|
||||||
|
elif data['path_pem'].is_file():
|
||||||
|
pem = data['path_pem'].read_bytes()
|
||||||
|
cert = SATCertificate(cer, key, pem)
|
||||||
|
return cert
|
||||||
|
|
||||||
|
|
||||||
def _validate_requests_args(args):
|
def _validate_requests_args(args):
|
||||||
result, data = _validate_fiel_args(args)
|
result, data = _validate_fiel_args(args)
|
||||||
if not result:
|
if not result:
|
||||||
return False, {}
|
return False, {}
|
||||||
|
|
||||||
if not data['path_enc'].is_file():
|
if not data['path_enc'].is_file() and not data['path_pem'].is_file():
|
||||||
msg = f"No se encontró la FIEL encriptada. \nRuta: {data['path_enc']}"
|
msg = f"No se encontró la FIEL [enc|pem].\nRuta: {data['path_enc']}"
|
||||||
log.error(msg)
|
log.error(msg)
|
||||||
return False, {}
|
return False, {}
|
||||||
|
|
||||||
cer = data['path_cer'].read_bytes()
|
# ~ cer = data['path_cer'].read_bytes()
|
||||||
key = data['path_enc'].read_bytes()
|
# ~ key = data['path_enc'].read_bytes()
|
||||||
cert = SATCertificate(cer, key)
|
# ~ cert = SATCertificate(cer, key)
|
||||||
|
cert = _get_cert(data)
|
||||||
|
|
||||||
if not cert.is_valid_time:
|
if not cert.is_valid_time:
|
||||||
msg = 'La FIEL no es vigente'
|
msg = 'La FIEL no es vigente'
|
||||||
|
|
Loading…
Reference in New Issue