|
1 | 1 | # -*- coding: utf-8 -*-
|
2 | 2 |
|
3 |
| -from .base import Entidade |
4 |
| -from OpenSSL import crypto |
5 |
| -import tempfile |
6 | 3 | import os
|
| 4 | +import tempfile |
| 5 | + |
| 6 | +from cryptography.hazmat.primitives.serialization import ( |
| 7 | + Encoding, |
| 8 | + NoEncryption, |
| 9 | + PrivateFormat, |
| 10 | + pkcs12, |
| 11 | +) |
| 12 | + |
| 13 | +from .base import Entidade |
7 | 14 |
|
8 | 15 |
|
9 | 16 | class Certificado(Entidade):
|
@@ -49,43 +56,52 @@ def separar_arquivo(self, senha, caminho=False):
|
49 | 56 | "Falha ao abrir arquivo do certificado digital A1. Causa desconhecida."
|
50 | 57 | ) from exc
|
51 | 58 |
|
| 59 | + if not isinstance(senha, bytes): |
| 60 | + senha = str.encode(senha) |
| 61 | + |
52 | 62 | # Carrega o arquivo .pfx, erro pode ocorrer se a senha estiver errada ou formato invalido.
|
53 | 63 | try:
|
54 |
| - pkcs12 = crypto.load_pkcs12(cert_conteudo, senha) |
55 |
| - except crypto.Error as exc: |
56 |
| - raise Exception( |
57 |
| - "Falha ao carregar certificado digital A1. Verifique a senha do" |
58 |
| - " certificado." |
59 |
| - ) from exc |
60 |
| - except Exception as exc: |
61 |
| - raise Exception( |
62 |
| - "Falha ao carregar certificado digital A1. Causa desconhecida." |
63 |
| - ) from exc |
| 64 | + ( |
| 65 | + chave, |
| 66 | + cert, |
| 67 | + ) = pkcs12.load_key_and_certificates( |
| 68 | + cert_conteudo, senha |
| 69 | + )[:2] |
| 70 | + except Exception as e: |
| 71 | + if "invalid password" in str(e).lower(): |
| 72 | + raise Exception( |
| 73 | + "Falha ao carregar certificado digital A1. Verifique a senha do" |
| 74 | + " certificado." |
| 75 | + ) from e |
| 76 | + else: |
| 77 | + raise Exception( |
| 78 | + "Falha ao carregar certificado digital A1. Causa desconhecida." |
| 79 | + ) from e |
64 | 80 |
|
65 | 81 | if caminho:
|
66 |
| - cert = crypto.dump_certificate( |
67 |
| - crypto.FILETYPE_PEM, pkcs12.get_certificate() |
68 |
| - ) |
69 |
| - chave = crypto.dump_privatekey(crypto.FILETYPE_PEM, pkcs12.get_privatekey()) |
70 | 82 | # cria arquivos temporarios
|
71 | 83 | with tempfile.NamedTemporaryFile(delete=False) as arqcert:
|
72 |
| - arqcert.write(cert) |
| 84 | + arqcert.write(cert.public_bytes(Encoding.PEM)) |
73 | 85 | with tempfile.NamedTemporaryFile(delete=False) as arqchave:
|
74 |
| - arqchave.write(chave) |
| 86 | + arqchave.write( |
| 87 | + chave.private_bytes( |
| 88 | + Encoding.PEM, PrivateFormat.PKCS8, NoEncryption() |
| 89 | + ) |
| 90 | + ) |
75 | 91 | self.arquivos_temp.append(arqchave.name)
|
76 | 92 | self.arquivos_temp.append(arqcert.name)
|
77 | 93 | return arqchave.name, arqcert.name
|
78 | 94 | else:
|
79 | 95 | # Certificado
|
80 |
| - cert = crypto.dump_certificate( |
81 |
| - crypto.FILETYPE_PEM, pkcs12.get_certificate() |
82 |
| - ).decode("utf-8") |
| 96 | + cert = cert.public_bytes(Encoding.PEM).decode("utf-8") |
83 | 97 | cert = cert.replace("\n", "")
|
84 | 98 | cert = cert.replace("-----BEGIN CERTIFICATE-----", "")
|
85 | 99 | cert = cert.replace("-----END CERTIFICATE-----", "")
|
86 | 100 |
|
87 | 101 | # Chave, string decodificada da chave privada
|
88 |
| - chave = crypto.dump_privatekey(crypto.FILETYPE_PEM, pkcs12.get_privatekey()) |
| 102 | + chave = chave.private_bytes( |
| 103 | + Encoding.PEM, PrivateFormat.PKCS8, NoEncryption() |
| 104 | + ) |
89 | 105 |
|
90 | 106 | return chave, cert
|
91 | 107 |
|
|
0 commit comments