Gerar certificado dinâmico Itaú

Requisitos

Para a geração do certificado dinâmico, é necessário ser instalado:

  1. OpenSLL - Precisamos dele para rodar alguns comandos.
  2. GitBash - Terminal utilizado para escrever os comandos.
  3. Java - Necessário para rodar alguns scripts de código.
  4. Postman - Software para acesso de endpoints.

1- Obter par de chaves

Para gerar um par de chaves RSA, a qual é composta por uma chave privada (para decifrar) e uma chave pública (para criptografar), execute o seguinte comando no GitBash:

openssl genpkey -out private.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048
openssl rsa -in private.pem -pubout -out public.pem

Após executar os comandos, o par de chaves será gerado através de um arquivo denominado public.pem e outro private.pem.

Exemplo do conteúdo do arquivo public.pem:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtCm21MHeGMHN8e4uAZi
U/pKoIrtLoyOuoLmpogmWdiV2OJz3OjysQf7JLE1o7xmkwHI8JGg41wuUv+CF6Ax
0kk3EwV6AVkLnI2lOAY2LbrgwDtsGQh6gslIUJhiadHqwwnezBanTIgV+Z4sa02O
SWZGbWufXJ9PVP91LXy/d4oyHGbKMVUQlyK350+iL8Pw0reTy6MiKKPrdSaKkj87
PhrE/Fd3vIE1ANqhJjIgHNtB4iqo4VF8bBZKohkShu8IA5Y3uV2OkMz3lD/jNtJn
8J7D7uKYCB8Xy9Sy/8O+rwvyly7i7nWLG1zpVz7KD7+3KWrnmuf2o1gefCin1FLv
pwIDAQAB
-----END PUBLIC KEY-----

 

2 - Recebimento do Token temporário

Nesta etapa, deve-se enviar o arquivo public.pem para o time de atendimento do Itaú. Com esse arquivo o time do Itaú vai criptografar as informações de "Token temporário" e "client id" e envia-lo a seu e-mail cadastrado junto a eles. Esse processo pode demorar em média 1 dia útil.

Importante ressaltar que o Token temporário tem validade de 7 dias.

Exemplo de e-mail retornado pela equipe Itaú:

E-mail de credenciais

Olá parceiro, seja bem vindo ao Itaú_

Você já pode gerar seu certificado dinâmico com as credenciais abaixo:

ClientId: KWMMqDhJ+p/2fejfX2uktyDnAjT8B3u2FZCyPlyA5U5t3IU4VVcS6wY5KG+SZO+a

Token Temporário:

+B8tD52L3qrexAjr3vinhj1FGrfr/iGzx/lKhE2mHJPcjOCnLbCcqP52w3YDXNL+Zi2RKmEp0ZwRFzZYJzWNBMiQh65CKTIRMPBA/2GSQmreMz22dVf8YN2TcjMWtRJzPZRtu/WPUER1izEDWJdUFjMUlJQojUyDZZ2TJ6+B6io7k9ng18djcFmhDQYAbkCMl8oQymgXj8EYCMquWIW7DTK6Srw04VjIktc/eidzYRCpF94/U5uVIAXbrjVwBg9vxbGLiTU1NPR2doWdkA8u+HpZDX+SJjAun6BCD43JGudFI93/YreqvvKD1/QtZg57lTxt7NAw5Brqg4NU/flLF/djN8+c/gLuK/PbnNezWZ6dmdeHO7R2B/efcXvdztFGoXftwzz8FnfC8ZR3gPppIEOeDppduVhw3AXCquwMKDFKxlHaCsZcNwhFIOZvmvXzs1RHo8SoZmpXrdm5BjFZp/2NIprUNOXyMVYxa6NEm3Bv4HwTeE75yQ8xLSjzipThyB7i+2wqMjOQg1WvKzswv1azsMd8R8aQ6G6nvOH7YY0MBM6XAUJNBBQwT7tXSck4j9cOXPlQ6x8SBJluY+/nRptLyr+oG4cDAHGmT5CyRKUI+nfCllojFOFbf01AYnfT4HYhIDQ59afzboI2EH1MDItlESQQ+CstS33AKQe0OkdOOSIUwbOBIfceEhA2xQIDdOSwNTOYUjkfuccjE4fJS2hTcAuVle+MtVzHjb6gpeviqg7H7vxNjZcg8cmFM5sRB/LISPZ2nQ2j2N3BzJjp8XhEs0ML9ENV1XL/+zJdkC2EoxLUkyFIgrN1GD8KU4ZKZM090Ap3wOsv5OHG+mJPNQZqyNc8taDnNukXbduWZ5+IQmin2sz9JK28+88lwxeWY8qWuaB3z/2yV68UmLELpNEP0yg9qMkUflvvmfFKbYZGQGGNCQZuY5hYX5AiWUmDiEgb6CP5nMcO4Z0G65bPWQlsa/aH6yO8WWEe498syokszcMlCiM34Cn+hOa56trEBK0sbapFQYxuKBfUD3bpHr7a4MtZinGKZmv3daLg28XNW/NZQo7VsBsFIY4rZt9MMEuK5Cb9rx52mF4yLa1YvooQaqFlmkf86SogsPwUCw2Onw7FvBTccC7rPLa6/Fork7Zje9viAE9G0XGx2E3R4lqgv3DEquSCdfx3iYsE9c2s/bxW04EU9sZkd6jEj5ARkJADdQw8ope61PBGDDp7UcxMZi7SjZdNiqhYcIbyv9OtkdJ0qrlmCwYiB+nPmj5+

Chave Sessão:

KT9d4C4mthX9aFWHGwUlvBS3quLagK2NrDDAXxQWiBCcpu7RDdQE+/C0dATzAjMUUiqsuKpFSnakhI7b0uNAF3CzqNgTnGc6xtu3iOqma0W4pERASb4Lyh+X/A1+95575JVzJrnk9GvfSnn+GMfqv7Kx5uxYBHr8BfOn8R6Pl3Jdi5tAwvynJohFaXx45LM6BKp+R+B7Rk59VyWsQZ/Qzv6Ks7KgKUr/RtyoNlthcmSQAJw9NKoepV4p59uBBZuAwZ+96BLpzgarEB/PIa9bn172TW9ruP24nMA5tssGI6mpHu1ZHPrh67gUH6jD/4fqSwY/IiriAUX3tS6/QZsjABoWBs1QFdM7ImSEnneBzzv1kG2C15x7raPRryzWwBLjN88GOa++kdjpOEzugwzgtgR9WDFYTSxq58mJw3A0yI4jBfkp/dxjQfBeUdq0RToVEAjfPpq+lzgS9RDASjACLCyfKIo8tnHp63dKT7HjHieVv0B7f5Kwq2+NJDUxYDuwEeHRPWx5DVBv5lVse4heAGgLc1VvespTifsoaI/Jj1WUMBk2h+s8xG7e2M0TSZIh+RxQ4s0weA3SbalWqRR+E3pQuf3c0xxosdKiEqhkHmrNnqllU/6QFtj9h0tgWkgrDb3suk9pXHieuePwN/LRmKF3ImnBF35HZrapqRQI+ws=

3 - Decifrar credenciais

Após receber o e-mail com as informações, crie um arquivo chamado Criptografia.java com o seguinte código dentro dele:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.Scanner;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Criptografia {

    private static String extrairChaveRsaPem(String tipoChave, String arquivoChavesRsa) {

        try {
            InputStream is = new FileInputStream(arquivoChavesRsa);
            @SuppressWarnings("resource")
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            boolean inKey = false;
            for (String line = br.readLine(); line != null; line = br.readLine()) {
                if (!inKey) {
                    if (line.startsWith("-----BEGIN ") && line.endsWith(" " + tipoChave + " KEY-----")) {
                        inKey = true;
                    }
                } else {
                    if (line.startsWith("-----END ") && line.endsWith(" " + tipoChave + " KEY-----")) {
                        inKey = false;
                        break;
                    }
                    sb.append(line);
                }
            }
            return sb.toString();
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static String decriptografiaAes(SecretKey key, String cipherText) {

        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(new byte[16]);
            cipher.init(Cipher.DECRYPT_MODE, key, iv);
            byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));

            return new String(plainText);
        }
        catch(NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch(BadPaddingException e) {
            e.printStackTrace();
        }
        catch(IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        catch(InvalidKeyException e) {
            e.printStackTrace();
        }
        catch(InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
        catch(NoSuchPaddingException e) {
            e.printStackTrace();
        }

        return null;
    }

    private static byte[] decriptografiaRsa(String caminhoChavePrivada, String dadosCifrados) {

        try {
            String chavePrivada = extrairChaveRsaPem("PRIVATE", caminhoChavePrivada);

            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(chavePrivada.toString()));
            KeyFactory kf = KeyFactory.getInstance("RSA");
            RSAPrivateKey privateKey = (RSAPrivateKey) kf.generatePrivate(spec);

            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);

            return cipher.doFinal(Base64.getDecoder().decode(dadosCifrados));

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args)
    {
        SecretKey chaveSessao = null;
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.println("\n=========================================");
            System.out.println("Informe as informações recebidas no e-mail");
            System.out.println("=========================================");

            System.out.println("\nClientId: ");
            System.out.flush();
            String clientIdCifrado = scanner.nextLine().trim();

            System.out.println("\nToken Temporário: ");
            System.out.flush();
            String tokenCifrado = scanner.nextLine().trim();

            System.out.println("\nChave Sessão: ");
            System.out.flush();
            String chaveSessaoCifrada = scanner.nextLine().trim();

            System.out.println("\nCaminho chave privada: ");
            System.out.flush();
            String caminhoChavePrivada = scanner.nextLine().trim();

            System.out.flush();
            scanner.close();

            System.out.println("\n=====================================");
            System.out.println("    Processo de Decriptografia         ");
            System.out.println("=====================================");

            // Decifra a chave de sessao AES com a chave RSA privada
            byte[] chaveSessaoDecifrada = decriptografiaRsa(caminhoChavePrivada, chaveSessaoCifrada);
            chaveSessao = new SecretKeySpec(chaveSessaoDecifrada, 0, chaveSessaoDecifrada.length, "AES");
            // Decriptografa a credencial atraves da chave de sessao AES
            String clientIdDecifrada = decriptografiaAes(chaveSessao, clientIdCifrado);
            System.out.println("\nClient id decifrado com a chave de sessao AES:\n[ " + new String(clientIdDecifrada) + " ]");
            String tokenDecifrado = decriptografiaAes(chaveSessao, tokenCifrado);
            System.out.println("\nToken decifrado com a chave de sessao AES:\n[ " + new String(tokenDecifrado) + " ]");
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Após isso, execute os seguintes comandos no terminal GitBash (O terminal deve ser aberto na mesma pasta que o arquivo Criptografia.java foi salvo):

javac Criptografia.java
java -cp . Criptografia

Ao executar esses comandos, preencha os dados solicitados no terminal GitBash de acordo com o que foi recebido no e-mail:

ClientId: ClientId presente no e-mail
Token Temporário: Token Temporário presente no e-mail
Chave sessão: Chave sessão presente no e-mail
Caminho da chave privada: escreva o caminho onde está o arquivo private.pem gerado anteriormente.

Após informar esses dados, o terminal deve exibir a resposta, semelhante as informações abaixo:

Credenciais decifradas

Processo de Decriptografia
Client id decifrada com a chave de sessao AES:

e26f2f89-0ead-4ca6-8bc3-dd44b4ab3cc7

Token decifrado com a chave de sessao AES:

eyJraWQiOiJhZTYxYWIxZi0yNTRhLTQ5ZWQtODMzNC05ZDJlN2E0MzZiNGQuaG9tLmdlbi4xNTk3NjAwMzM2OTkyLmp3dCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJlMjZmMmY4OS0wZWFkLTRjYTYtOGJjMy1kZDQ0YjRhYjNjYzciLCJhdXQiOiJNQVIiLCJ2ZXIiOiJ2MS4wIiwiaXNzIjoiaHR0cHM6XC9cL29wZW5pZC5pdGF1LmNvbS5iclwvYXBpXC9vYXV0aFwvdG9rZW4iLCJBY2Nlc3NfVG9rZW4iOiIyYWEzZmU5NS43OGM2YjhmNS1lZWJjLTQxMzQtYmJlZS1hZDAzMjZmMTRmM2EiLCJzb3VyY2UiOiJFWFQiLCJlbnYiOiJIIiwic2l0ZSI6ImRldiIsInVzciI6Im51bGwiLCJtYmkiOiJ0cnVlIiwidXNlcl9pZCI6ImUyNmYyZjg5LTBlYWQtNGNhNi04YmMzLWRkNDRiNGFiM2NjNyIsInNjb3BlIjoiZXNjb3BvX2RlZmF1bHQiLCJleHAiOjE2MTg5NDIyMTIsImlhdCI6MTYxODUxMDIxMiwiZmxvdyI6IkNDIn0.ZEIGYAUu-8-aCirhuClcp4F4qpL9L0KFh0pQJggXieUSCEasX-3I5QLvp5BkKcE2RhwvRfW2dUuiXJGaDqK_Mri6wZ8gVVdeHaP3ctwm8_4WBdHzxVPsAQKv2MAi8IWvHaFLFLUFcF7Z9-fpTkve_8SBnnJb4L_O7SYzXgxg3zpYSCFwMr4SrBvidq2plajEbytcDXikAXyibAWr2OH5Aijq8yfIc6dbMbH2ueA1V3mft7b_eueBQlihF1PHbytVWah6RleR5He9FLbjygcZ-F-1ygx5yTSl_DMCGn4uCYmH5IfkZa9jC9A2-t4jlIlvFZHeGVl_c2-xaWFBd_9ryQ

4 - Geração do arquivo .csr e .key

Para gerar os arquivos .csr e .key, deve criar uma pasta para salvar os arquivos, e em seguida abrir o terminal GitBash nesta pasta.

Em sequência rodar o seguinte comando:

Para Windows:

openssl req -new -subj "//CN={{CLIENT_ID}}\OU=SITE OU APP DO PARCEIRO\L=CIDADE\ST=ESTADO\C=BR" -out ARQUIVO_REQUEST_CERTIFICADO.csr -nodes -sha512 -newkey rsa:2048 -keyout ARQUIVO_CHAVE_PRIVADA.key

Para Linux:

openssl req -new -subj "/CN={{CLIENT_ID}}/OU=SITE OU APP DO PARCEIRO/L=CIDADE/ST=ESTADO/C=BR" -out ARQUIVO_REQUEST_CERTIFICADO.csr -nodes -sha512 -newkey rsa:2048 -keyout ARQUIVO_CHAVE_PRIVADA.key

Lembre-se de alterar algumas das informações do script acima seguindo os dados repassados pelo banco:
CN= ClientID disponibilizado no e-mail
OU= Deixe preenchido com o nome do app que vai utilizar o certificado (exemplo: MSYSGESTOR)
L= Cidade onde se localiza a Agência do Cliente (exemplo: SAO MIGUEL DO OESTE)
ESTADO= Estado onde se localiza a Agência do Cliente (exemplo: SANTA CATARINA)
C= País onde se localiza a Agência do Cliente (exemplo: BR)
ARQUIVO_REQUEST_CERTIFICADO.csr= Nome do certificado, deve manter o ".csr" no final
ARQUIVO_CHAVE_PRIVADA.key=Nome da chave vinculada ao certificado, deve manter o ".key" no final

OBS: as informações OU, L, ESTADO e C devem ser todas escritas em caixa alta e sem nenhuma acentuação ou caractere especial, segundo os exemplos acima.

Ao executar o comando, os seguintes arquivos serão gerados na pasta:

5 - Autenticar arquivo .csr e .key em um arquivo .crt

O envio do arquivo .csr para o banco deve ser feito via API, através de um endpoint POST. Aconselhamos o uso do software Postman para isso.

Na URL da requisição:

  • inserir https://sts.itau.com.br/seguranca/v1/certificado/solicitacao

No header da requisição:

  • Insira um Content-Type= text/plain
  • Insira um Authorization: bearer {token temporário}

No body da requisição:

  • insira o certificado.csr gerado anteriormente em texto. Para adquirir o texto desse arquivo, é só abri-lo com um editor de texto.

Ao enviar essa requisição POST para o Itaú, vai ser retornada duas informações, o Secret e a nova informação do certificado.

Copie o Secret e salve em um arquivo com extensão .key e o conteúdo do certificado em um arquivo com extensão .crt, preferencialmente salve ambos em uma nova pasta.

6 - Gerar arquivo .pfx

Acesse a pasta criada com os arquivos .crt e .key gerados no passo anterior, e após isso abra o GitBash nessa pasta.

Insira a seguinte informação no terminal:

openssl pkcs12 -export -out certificado_dinamico_itau.pfx -inkey certificadoKey.key -in certificadoGerado.crt

Lembre-se de alterar algumas das informações do script acima seguindo os dados repassados pelo banco:
certificadoKey.key= Insira o nome do arquivo gerado no passo anterior, mantenha a extensão .key no final.
certificadoGerado.crt= Insira o nome do arquivo gerado no passo anterior, mantenha a extensão .crt no final.

Em sequência vai ser solicitado uma senha para o certificado e a confirmação da senha. Preencha a senha desejada as duas vezes.

Ao final vai ser gerado o seu certificado dinâmico para realizar o upload dele no sistema MsysGestor.

 

Referências

https://atendimento.tecnospeed.com.br/hc/pt-br/articles/7003805388567-Utilizando-o-registro-via-Web-Service-Banc%C3%A1rio-com-o-Ita%C3%BA-V2-

https://forum.casadodesenvolvedor.com.br/topic/43985-gerando-certificado-crt-para-o-banco-ita%C3%BA-pix-e-boleto-webservice/

https://forum.casadodesenvolvedor.com.br/topic/43793-como-converter-um-arquivo-de-certificado-crt-para-o-formato-pfx/

https://devportal.itau.com.br/certificado-dinamico

Back to top