Comunidade
Erro ao criar Certificado Digital
Fiz o Cadastro de um cliente na api com o sandbox peguei o token do cliente, fiz o arquivo chaves-privadas como mostrado asseguir :
from flask import Flask, jsonify
import time
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
app = Flask(name)
Geração da chave RSA
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
Serialização da chave privada para o formato PEM (PKCS8)
private_key_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL, # Pode mudar para PKCS8 se necessário
encryption_algorithm=serialization.NoEncryption() # Adicionando o algoritmo de criptografia
)
Serialização da chave pública para o formato PEM
public_key_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
Salvar a chave privada em um arquivo
with open('chave_privada.pem', 'wb') as pem_file:
pem_file.write(private_key_pem)
Salvar a chave pública em um arquivo
with open('chave_publica.pem', 'wb') as pem_file:
pem_file.write(public_key_pem)
print("Chave privada armazenada em 'chave_privada.pem'")
print("Chave pública armazenada em 'chave_publica.pem'")
Data de criação da chave em timestamp (em milissegundos)
created_at = int(time.time() * 1000)
@app.route('/key', methods=['GET'])
def get_key():
response_data = {
"public_key": public_key_pem.decode('utf-8'),
"created_at": created_at
}
return jsonify(response_data), 200 # Retorna o JSON com status 200
if name == 'main':
app.run(debug=True)
Esse código gera mais dois arquivos chamados respectivamente chave_privada.pem e chave_publica.pem, ai criei o outro seguinte arquivo chamado challenge.py:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization, hashes
import base64
Geração da chave RSA
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
Mensagem original
message = b"Mensagem secreta"
Criptografar a mensagem com a chave pública
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
print(ciphertext)
Codificar o ciphertext em base64
encrypted_challenge = base64.b64encode(ciphertext).decode('utf-8')
print(f"Ciphertext (base64): {encrypted_challenge}")
Agora você pode usar 'encrypted_challenge' no seu código de decriptação.
Que gera um Challenge que tento usar como X_CHALLENGE ali em Certificado Digital, segui certinho a documentação do Challenge Connection, mas aparentemente algo que estou fazendo não se encaixa, talvez seja por estar fazendo tudo em python, mas realmente não sei o que pode ser, só sei que ali em Authorization, já tentei usar o token do portal do desenvolvedor o do cliente, mas não consegui e outros tokens, mas não deu certo, sempre ocorre o seguinte erro :
{"message":"User is not authorized to access this resource with an explicit deny", "description": "The challenge must be solved correctly before the expiration time (30 seconds), must match the access_token it was generated with, and the token must have the required scope 'certificate.create'"}
Alguém consegue me ajudar?