These docs are for v1.0. Click to read the latest docs for v4.1.

Comunidade

Ask a Question
Back to All

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?

© 1996- Todos os direitos reservados.

PAGSEGURO INTERNET INSTITUIÇÃO DE PAGAMENTO S/A - CNPJ/MF 08.561.701/0001-01

Av. Brigadeiro Faria Lima, 1.384, São Paulo - SP - CEP 01451-001