geração do certificado dinâmico

Neste guia você encontra as informações necessárias para gerar o Certificado Dinâmico e ter acesso às APIs do Itaú.

Novidade: Modernizamos o e-mail do Itaú para trazer maior segurança e agilidade aos nossos clientes. Atualize o seu código .java para descriptografar as credenciais, para mais informações acesse o Passo 6 – Descriptografar as credenciais.

objetivo

O conteúdo desta documentação é explicar alguns conceitos importantes sobre o tema, instruir como solicitar as credenciais e demonstrar o fluxo da geração do Certificado Dinâmico.

Importante: Para APIs de cartões não é preciso gerar o certificado dinâmico via STS, pois este processo não é um padrão para todo o banco. Ou seja, depende do negócio, comunidade, ou segurança de acordo com o projeto.

conceitos

o que é o certificado dinâmico (CSR)?

O Certificate Sign Request é um certificado não assinado e usado apenas no ambiente de produção, gerado pelo responsável técnico que contém os dados da empresa requisitante e sua chave pública.

Esse procedimento é realizado para que ao solicitar um certificado ao Itaú o solicitante identifique sua aplicação e receba um certificado de uso único e exclusivo.

O CSR (Certificate Sign Request) é o arquivo que contém a chave pública do certificado e as demais informações de identificação. Utilizado para requisitar ao STS Itaú a assinatura do certificado.

Seu formato segue o seguinte padrão:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

A segurança do processo é baseada no conceito de chave assimétrica ou chave pública

Importante:

Renovar/gerar o certificado dentro do prazo de validade de 365 dias - Basta utilizar o arquivo .CSR gerado anteriormente e o token temporário gerado pela sua aplicação, cuja validade é de 5 minutos.

Decorrido o prazo de 365 dias do certificado - Solicite um novo token temporário ao seu ponto focal do Itaú, a validade deste token é de 7 dias corridos para este cenário.

Dica: Recomendamos fortemente o estudo dos conteúdos acima para aprofundamento técnico sobre os conceitos de CSR e chave pública. Entretanto, para fins de uso operacional, não é obrigatório.

chave pública

A chave pública é um valor gerado a partir de operações matemáticas com a chave privada. Como seu nome já sugere, seu conhecimento pode ser público e não é necessário ser armazenada de forma confidencial. Seu valor fica embutido dentro do próprio certificado.

chave privada

A chave privada é um valor altamente sensível. Portanto, deve ser armazenada de forma segura, ela será requisitada para comprovar que o certificado está em uso pelo seu dono no processo de mutual TLS.

Seu formato segue o seguinte padrão:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

SSL

O SSL (Secure Socket Layer) na requisição, oferece total segurança entre aplicativos cliente/servidor, preservando a integridade e a veracidade do conteúdo trafegado na rede, por meio da autenticação das partes envolvidas com a troca destas informações. A versão recomendada pelo banco é a 1.1.1.c ou superior.

credenciais

As credenciais é o conjunto client_id + client_secret.

token temporário

O token é um valor obtido através do STS Itaú que representa a autenticação da credencial. Ele é obrigatório para consumo das APIs disponibilizadas pelo Itaú, assim como o certificado.

Como faço para obter um token temporário?

Para obter um token temporário do Itaú o procedimento varia conforme a etapa da jornada em que você está: onboarding ou consumo.

  • Etapa de onboarding- Esta etapa é quando você está iniciando seu contato com o Itaú , você receberá um token temporário por e-mail com validade de 7 dias corridos com o único objetivo de emitir suas credenciais e o certificado, após este período esse token será invalidado. É fundamental seguir o procedimento de recebimento das credenciais de acesso e emissão do certificado dentro desse prazo a contar da data de emissão do token.

Importante: Vale ressaltar que o Token enviado tem validade de 7 dias para o início do fluxo de geração de certificado. Caso não seja utilizado dentro desse período, você precisará solicitar novamente e aguardar o tempo de resposta, correspondente a 1 dia útil.

  • Etapa de Consumo- Esta etapa é quando você já tem em mãos suas credenciais e o certificado devidamente emitidos pelo STS Itaú. O processo de emissão do token é bem simples e pode ser realizado por meio de requisição ao STS Itaú.

Importante: O token emitido pelo STS Itaú tem duração de 5 minutos e deve ser utilizado durante esse período para consumo das APIs sendo necessário sua renovação sempre que estiver próximo a expirar.

1.JPG

Figura 01. A imagem acima demonstra todo o fluxo da Solicitação de credenciais para Cobranças e uso externo.

novos usuários: gerar pela primeira vez as credenciais e o certificado dinâmico

Se você é um novo usuário, e vai gerar seu certificado dinâmico pela primeira vez, primeiramente, você deve observar os pré-requisitos, depois o passo a passo para gerar as credenciais e, por último, prosseguir com o Passo 7 – passo a passo para gerar o certificado dinâmico.

pré-requisitos para gerar o certificado dinâmico

Para gerar o certificado dinâmico, os pré-requisitos abaixo devem ser observados:

credenciais – Tenha o (client_id, token temporário e a chave de seção), você receberá essas informações via e-mail por meio do seu ponto focal do Itaú.

openSSL - Tenha o OpenSSL na versão 1.1.1 recomendada pelo banco instalado em sua máquina, pois será a ferramenta utilizada neste tutorial para gerar o arquivo CSR e validar se tudo ocorreu como o esperado.

Importante: Por padrão o OpenSSL vem por default para quem tem o Git Bash instalado na máquina.

par de chaves – Tenha as chaves pública e privada, geradas por meio da ferramenta OpenSSL.

IDE – Tenha o JAVA ou uma IDE de sua preferência pois será necessário para executar o arquivo .java, o qual será utilizado no processo de descriptografia das credenciais.

passo a passo para gerar as credenciais

Passo 1 – Instalar em sua máquina a ferramenta OpenSSL na versão 1.1.1 recomendada pelo banco;

Dica: Caso opte por utilizar o Git Bash, por padrão o OpenSSL já vem instalado.

Passo 2 – Gerar o par de chaves (pública e privada);

2.1 - Criar uma pasta específica no diretório na própria máquina para salvar o par de chaves;

2.2 - Abrir essa mesma pasta via terminal e executar primeiro este comando para conferir se está na versão 1.1.1, recomendada pelo banco:

openSSL version

2.JPG

Figura 02: A imagem acima demostra a execução do comando openSSL version no Git Bash para conferir a versão do openSSL instalada.

Passo 3 - Após conferir a versão, agora execute estes comandos no terminal para gerar o par de chaves (private.pem e public.pem) na pasta do diretório;

openssl genpkey -out private.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048 

openssl rsa -in private.pem -pubout -out public.pem  

3.JPG Figura 03: A imagem acima demostra a execução dos comandos openssl genpkey -out private.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048 e openssl rsa -in private.pem -pubout -out public.pem no Git Bash para gerar o par de chaves na pasta do diretório.

Passo 4 - Confira se o par de chaves foi gerado corretamente na pasta criada no diretório.

Passo 5– Envie a chave pública ao Officercash , ou seja, seu ponto focal do Itaú que solicitará ao time de Backoffice suas credenciais criptografadas.

Importante: Recomendamos que o envio da chave pública ao seu ponto focal do Itaú seja realizado por e-mail e que a chave privada seja mantida em local seguro pois ela será utilizada posteriormente.

O time de Backoffice lhe enviará por e-mail as credenciais criptogradas, contendo o Client ID, Token temporário e a Chave de Sessão.

Importante: O Token temporário enviado pelo time de Backoffice tem validade de 7 dias para o início do fluxo de geração de certificado. Caso não seja utilizado dentro desse período, você precisará solicitar novamente e aguardar o tempo de resposta, correspondente a 1 dia útil.

Observe as informações a seguir, o e-mail deve chegar da seguinte forma:

Assunto do e-mail: Credenciais Itaú

O remetente padrão de nossos e-mails é: itau@itau.com.br, para sua própria segurança não aceite e-mails que não sejam deste remetente. Exceto em casos em que haja um alinhamento prévio com o seu representante Itaú sobre o envio dos dados.

Dica: Crie uma regra para não cair na caixa de SPAM/Lixo Eletrônico e confira os dados antes de abrir o e-mail. O e-mail deve conter a Razão Social e o CNPJ de sua empresa para sua identificação.

Exemplo de e-mail:

template_email.png

Figura 04: A imagem acima mostra um exemplo de e-mail recebido com as credenciais.

Importante: Caso surja alguma dúvida entre em contato com o seu representante Itaú.

Passo 6 – Descriptografar as credenciais


Existe duas opções para descriptografar as credenciais recebidas por e-mail mencionado no passo anterior, escolha uma delas para realizar este passo.

  • Primeira opção: Por meio de uma IDE (Ex: Eclipse, IntelliJ)
  1. Crie um arquivo .java e o nomeie obrigatoriamente "Criptografia.java";

  2. Copie este código .java, execute-o direto na IDE de sua preferência e insira as credenciais criptografadas (Client_id, Token temporário e a Chave Sessão) que você recebeu por e-mail no passo anterior:

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("Coloque as informacoes recebidas no e-mail");
            System.out.println("=========================================");

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

            System.out.println("\nToken Temporario: ");
            System.out.flush();
            String tokenCifrado = scanner.nextLine().trim().replace("\n", "").replace("\r", "").replace(" ", "");

            System.out.println("\nChave Sessao: ");
            System.out.flush();
            String chaveSessaoCifrada = scanner.nextLine().trim().replace("\n", "").replace("\r", "").replace(" ", "");

            System.out.println("\nCaminho chave privada (Nao use espacos/Caracteres especiais): ");
            System.out.flush();
            String caminhoChavePrivada = scanner.nextLine().trim().replace("\n", "").replace("\r", "").replace(" ", "");

            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();
        }
    }
}

Ao executar a aplicação com os valores informados, as credenciais serão exibidas no terminal.

Observe abaixo o modelo de e-mail que você receberá após decifrar suas credenciais:

Credenciais decifradas

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

e26f2f89-xxxxx-4ca6-8bc3-xxxxxxxxxxxxcc7

Token decifrado com a chave de sessao AES:

eyJraWQiOiJhZTYxYWIxZi0yNTRhLTQ5ZWQtODMzNC05ZDJlN2E0MzZiNGQuaG9tLmdlbi4xNTk3NjAwMzM2OTkyLmp3dCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJlxxxxxxxxxxFkLTRjYTYtOGJjMy1kZDQ0YjRhYjNjYxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxE2MTg5NDIyMTIsImlhdCI6MTYxODUxMDIxMiwiZmxvdyI6IkNDIn0.ZEIGYAUu-8-aCirhuClcp4F4qpL9L0KFh0pQJggXieUSCEasX-3I5QLvp5BkKcE2RhwvRfW2dUuiXJGaDqK_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-fpTkve_8SBnnJb4L_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-F-1ygx5yTSl_DMCGn4uCYmH5IfkZa9jC9A2-t4jlIlvFZHeGVl_c2-xaWFBd_9ryQ
  1. Copie o client_id decifrada com a chave de sessao AES e o token decifrado com a chave de sessão AES que foram gerados e salve em local seguro pois você irá utilizá-los para gerar seu certificado dinâmico.
  • Segunda opção: Tenha o JRE ou tenha o java 8 ou superior em sua máquina:

  1. Crie um arquivo .java e o nomeie obrigatoriamente "Criptografia.java";

  2. No mesmo diretório onde foi criado o arquivo .java, compile o código através do comando:

javac Criptografia.java
java -cp . Criptografia
  1. E, então o execute com:
java -cp . Criptografia 

Importante: Caso você tenha duas versões do java instalada, use o comando abaixo para compilar o código com a versão 8 ou superior, de acordo com a versão que você tem instalada em sua máquina.

javac –release 8 Criptografia.java
  1. Preencha os dados que serão solicitados conforme o que foi recebido via 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 chave privada: Copie o caminho do diretório que foi criado onde contém a chave privada. Exemplo: C:/Users/Cliente/Certificado/private.pem

Importante: Preencha corretamente a posição das barras / /, pois se estiverem na posição contrária o arquivo não será encontrado.

Importante: O caminho da chave privada não deve conter espaços em branco.

Ao executar a aplicação com os valores informados, as credenciais serão exibidas no terminal.

Observe abaixo o modelo de e-mail que você receberá após decifrar suas credenciais:

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
  1. Copie o client_id decifrada com a chave de sessao AES e o token decifrado com a chave de sessão AES que foram gerados e salve em local seguro pois você irá utilizá-los para gerar seu certificado dinâmico.

Ao final dos passos mencionados até aqui, você já deve estar com as suas credenciais decifradas para iniciar o processo de geração do Certificado Dinâmico.

Passo 7 – passo a passo para gerar o certificado dinâmico

Para gerar o Certificado Dinâmico o client_id e o token temporário que deverão ser preenchidos neste passo, são as credenciais que foram decifradas no passo anterior.

1 - Escolha o seu sistema operacional (Windows ou Linux e macOS) e execute no OpenSSL os comandos correspondentes conforme o sistema escolhido;

2 - Após escolher seu sistema operacional, insira o client_id e o token temporário decifrados nos campos correspondentes;

3 - Troque o valor dos parâmetros de acordo com as instruções da tabela explicativa, não esqueça de remover as chaves {{ }} e não utilizar caracteres especiais.

Confira abaixo os comandos referente ao sistema operacional:

Windows

  • Copie o comando abaixo, insira suas credenciais decifradas e o execute em seu terminal.

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

Exemplo de como deve ficar o comando a ser executado:

openssl req -new -subj "//CN=56a29ee3-60fe-47f8-95d9-7538b80ccf04\OU=ABC LTDA\L=SAO PAULO\ST=SP\C=BR" -out ARQUIVO_REQUEST_CERTIFICADO.csr -nodes -sha512 -newkey rsa:2048 -keyout ARQUIVO_CHAVE_PRIVADA.key

O comando foi executado com sucesso, caso a saída abaixo seja exibida:

Generating a RSA private key
...........................+++++
...............................................................+++++
writing new private key to 'ARQUIVO_CHAVE_PRIVADA.key'
-----

Linux e macOS

  • Copie o comando abaixo, insira suas credenciais decifradas e o execute em seu terminal.

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

Exemplo de como deve ficar o comando a ser executado:

openssl req -new -subj "/CN=56a29ee3-60fe-47f8-95d9-7538b80ccf04OU ABC LTDA L=SAO PAULOST=SP/C=BR" -out ARQUIVO_REQUEST_CERTIFICADO.csr -nodes -sha512 - newkey rsa:2048 -keyout ARQUIVO_CHAVE_PRIVADA.key

O comando foi executado com sucesso, caso a saída abaixo seja exibida:

Generating a RSA private key
...........................+++++
...............................................................+++++
writing new private key to 'ARQUIVO_CHAVE_PRIVADA.key'

Importante: Caso você utilize o client_id e token temporário recebidos por e-mail pelo time de Backoffice, o processo não ocorrerá conforme o esperado pois ambos necessitam estarem decifrados.

Observe a tabela explicando cada campo a ser preenchido mencionado no item anterior:

tabela explicativa

Parâmetro

Descrição

{{CLIENT_ID}}

É o Client_Id enviado pelo Itaú por meio do e-mail (após o processo de descriptografia). Esse valor é fundamental para garantir a autenticidade do certificado, ele é comparado com o client_id contido no token temporário durante o processo de envio ao STS Itaú, portanto, redobre a atenção. Exemplo a ser usado: 56a29ee3-60fe-47f8-95d9-7538b80ccf04

{{SITE OU APP DO PARCEIRO}}

É um nome simples para identificar facilmente o serviço integrado ao Itaú. Uma sugestão é utilizar o nome do cliente/parceiro. Não use caracteres especiais. Exemplo: ABC LTDA

{{CIDADE}}

Nome da cidade da empresa. Não use caracteres especiais. Exemplo: SAO PAULO

{{ESTADO}}

Nome do estado da empresa. Somente a UF. Exemplo: SP

{{PAIS}}

Nome do país da empresa. Somente o código internacional de duas letras. Exemplo: BR

validar o certificado dinâmico (opcional)

Caso queira validar o certificado dinâmico após tê-lo gerado, é necessário conferir se ambos os arquivos mencionados abaixo existem no diretório.

  • ARQUIVO_REQUEST_CERTIFICADO.CSR - É o nome do arquivo CSR que será gerado no local que o comando foi executado.

  • ARQUIVO_CHAVE_PRIVADA.KEY - É o arquivo que contém a chave privada do certificado, também é gerado no mesmo local do CSR. É obrigatório mantê-lo armazenado em segurança porque ele será utilizado pela aplicação na integração ao Itaú.

Para validar, você pode utilizar uma ferramenta conforme sua preferência.

Ou, executar o comando abaixo no OpenSSL;

openssl req -in ARQUIVO_REQUEST_CERTIFICADO.csr -noout -text

Se tudo ocorreu como o esperado, em nosso exemplo a saída seria similar a esta:

$ openssl req -in ARQUIVO_REQUEST_CERTIFICADO.csr -noout -text
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: CN = 56a29ee3-60fe-47f8-95d9-7538b80ccf04, OU = ABC LTDA, L = SAO PAULO, ST = SP, C = BR
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha512WithRSAEncryption
         ...

Importante:

  • O CN (Common Name) é o principal item a ser validado, ele deve ser exatamente igual ao client_id, devido ao processo de autorização no envio ao STS Itaú. -

  • Observe se o CN, OU, L, ST, e C estão preenchidos de acordo com os parâmetros de exemplo. Somente prosseguir ao próximo passo se os valores estiverem de acordo com os fornecidos no item 7 - passo a passo para gerar o certificado dinâmico.


Passo 8 - enviar o certificado dinâmico

Após a criação do ARQUIVO_REQUEST_CERTIFICADO.csr, ele deverá ser enviado ao STS Itaú para concluir o processo de geração do certificado dinâmico.

Este envio ocorrerá por meio de uma API que solicitará o token temporário para que a transferência seja finalizada.

  • O envio do arquivo CSR deverá ser feito por meio do endpoint https://sts.itau.com.br/seguranca/v1/certificado/solicitacao, que solicitará o token temporário para que a transferência seja finalizada, com as seguintes informações:

Header - O access_token_tmp é o token temporário decifrado, após o processo de descriptografia.

Authorization: Bearer {access_token_tmp} Content-Type: text/plain

Request Body - O conteudo_arquivo_csr é o conteúdo do ARQUIVO_REQUEST_CERTIFICADO.csr.

{conteudo_arquivo_csr}

Response Body- Você receberá do STS o client_secret e o certificado emitido pelo Itaú no formato .crt, isso significa que o retorno da chamada foi realizado com sucesso.

Observe um exemplo da chamada realizada com sucesso:

4.JPG

Figura 05 – A imagem acima demonstra o statusCode=200 que significa sucesso da chamada e no body do Response trará na primeira linha o client-secret e nas demais linhas será o certificado emitido pelo Itaú no formato .crt.

Observe um exemplo da chamada realizada com erro:

5.JPG

Figura 06 – A imagem acima demonstra que o envio do certificado CSR apresenta o erro C800, a mensagem informa que o CSR é inválido e como ação é solicitado que o envio seja verificado.

veja na prática como enviar o certificado dinâmico (CSR) e como receber o secret assinado juntamente com o certificado assinado pelo Itaú:

Confira nosso tutorial!

Vídeo 01 - O vídeo acima demonstra os passos na prática de como enviar o certificado dinâmico (CSR) e como receber o secret assinado juntamente com o certificado assinado pelo Itaú.


exemplos de envio do certificado dinâmico


Confira aqui exemplos de como enviar o certificado dinâmico via Postman e também em outras linguagens de programação:

  • Postman

geração e ativação do certificado dinâmico via Postman

O Postman é uma aplicação que permite realizar requisições HTTP a partir de uma interface simples, didática e intuitiva, com o objetivo de facilitar o teste e a depuração de serviços RESTful (Web APIs), por meio do envio destas requisições bem como a análise do seu retorno.

Com isso, é possível consumir facilmente serviços locais e na rede, enviar dados e efetuar testes sobre as respostas das requisições. Além disso, o Postman permite aos desenvolvedores analisar o funcionamento de serviços externos, a fim de saber como consumi-los.

E, pensando sempre em sua melhor experiência conosco, o portal Itaú for developers_ disponibiliza uma collection para lhe auxiliar na configuração do ambiente de testes via Postman.

Portanto, o primeiro passo para gerar e ativar o certificado dinâmico via Postman, é realizar o download da nossa Collection.

Dica: Você pode importar essa collection também em outra ferramenta, a exemplo o Insomnia.

Após a habilitação do Postman, o mesmo valida se está sendo enviado algum tipo de certificado SSL (Secure Socket Layer).

6.JPG

Figura 07 - A imagem acima demonstra os parâmetros gerais do Postman, o qual valida se está sendo enviado algum tipo de certificado SSL na requisição.

Importante: Vale ressaltar que devem ser armazenados os dados retornados pelo Itaú.

como enviar o certificado dinâmico via Postman

Para importar via Postman o ARQUIVO_CERTIFICADO.crs e o ARQUIVO_CHAVE_PRIVADA.key após a geração, siga os passos abaixo:

  1. Abra o Postman e clique no ícone da engrenagem, localizada no canto superior direito da página;
  2. Acionar a opção Settings;
  3. Em seguida, clique na aba Certificates;
  4. Clicar na opção Add Certificate;
  5. Preencher os campos conforme as informações abaixo:
  • Host: api.itau.com.br;
  • CRT file: selecione o arquivo_certificado.crt;
  • KEY file: selecione o arquivo_chave_privada.key;
  1. Clicar em Add para adicionar o arquivo.

7.JPG

Figura 08 - A imagem acima demonstra os 6 passos a serem seguidos para enviar o certificado via Postman.

veja na prática como enviar o certificado dinâmico (CSR) via Postman:

Confira nosso tutorial!

Vídeo 02 - O vídeo acima demonstra os passos na prática de como enviar o certificado dinâmico (CSR) via Postman.

  • outras linguagens de programação:

Agora, confira o envio do certificado dinâmico em outras linguagens de programação:

curl -i -k -X POST \
    --url https://sts.itau.com.br/seguranca/v1/certificado/solicitacao \
    -H "Content-Type: text/plain" \
    -H 'Authorization: Bearer {{access_token_tmp}}' \
    -d '{{CSR - Certificate Sign Request}}'

HttpURLConnection httpConnection = null;
SSLContext ctx = null;

try {
   ctx = SSLContext.getInstance("TLS");
} catch (NoSuchAlgorithmException e1) {
   e1.printStackTrace();
}
try {
   ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
} catch (KeyManagementException e1) {
   e1.printStackTrace();
}
SSLContext.setDefault(ctx);

try {
   URL targetUrl = new URL("https://sts.itau.com.br/seguranca/v1/certificado/solicitacao");

   httpConnection = (HttpURLConnection) targetUrl.openConnection();
   httpConnection.setDoOutput(true);
   httpConnection.setRequestMethod("POST");
   httpConnection.setRequestProperty("Content-Type", "text/plain");
   httpConnection.setRequestProperty("Authorization", "TOKEN TEMP");

   DataOutputStream wr = new DataOutputStream(httpConnection.getOutputStream());
   wr.writeBytes("CSR AQUI");
   wr.flush();
   wr.close();

if (httpConnection.getResponseCode() != HttpURLConnection.HTTP_OK) {
   throw new Exception("Erro na geracao do certificado");
}

StringBuilder crt = new StringBuilder();

try (Reader reader = new BufferedReader(new InputStreamReader
   (httpConnection.getInputStream(), Charset.forName(StandardCharsets.UTF_8.name())))) {
    int c = 0;
    while ((c = reader.read()) != -1) {
    if(c != 1)
   crt.append((char) c);
   }
} catch (IOException e) {
   e.printStackTrace();
}

String crtBody = crt.delete(0, crt.indexOf("\n") + 1).toString();
System.out.println(crtBody);

httpConnection.disconnect();

} catch (Exception e) {
   e.printStackTrace();
   //TODO
} finally {
   if (httpConnection != null) {
    httpConnection.disconnect();
   }
}

def sendCertificate(self, csr, token):
  try:
   url = "https://sts.itau.com.br/seguranca/v1/certificado/solicitacao"
   payload = csr
   headers = {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'text/plain'
  }
  response = requests.post(url, data=payload, headers=headers, cert=cert)


  if STATUS_OK != response.status_code:
  response.raise_for_status()


  crt = response.content.split("\n", 1)[1])
  print(crt)
except:
raise Exception("Erro na geracao do certificado")

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://sts.itau.com.br/seguranca/v1/certificado/solicitacao"); curl_setopt($ch, CURLOPT_PORT , 443); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "CERTIFICADO AQUI"); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: text/plain", 'Authorization': 'Bearer ' + token )); $response = curl_exec($ch); $info =curl_errno($ch)>0 ? array("curl_error".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch); print_r($info); curl_close($ch); echo $response;

public string SolicitarCertificado() { var request = (HttpWebRequest)WebRequest.Create( "https://sts.itau.com.br/seguranca/v1/certificado/solicitacao" );

request.ContentType = "text/plain";
request.Method = "POST";
request.Accept = "*/*";

request.Headers.Add("Accept-Encoding", "gzip, deflate, br");
request.Headers.Add("Authorization", "Bearer " + token);

string conteudoCSR = File.ReadAllText(
	@"C:\caminho_certificado\ARQUIVO_REQUEST_CERTIFICADO.csr"
);

request.ContentLength = conteudoCSR.Length;

string response = "";
string responseSecret = "";
Stream myWriter = null;

try
{
	using (var sw = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
	{
		sw.Write(conteudoCSR);
	}

	var requestResponse = (HttpWebResponse)request.GetResponse();

	response = new StreamReader(requestResponse.GetResponseStream()).ReadToEnd();

	StreamWriter FileCertificate;
	FileCertificate = File.CreateText(
		@"C:\caminho_certificado\ARQUIVO_REQUEST_CERTIFICADO.crt"
	);

	StringReader stringReader = new StringReader(getRetorno());
	var teste = response.Split(Environment.NewLine.ToCharArray());

	foreach (var item in teste)
	{
		if (item.Contains("Secret:"))
		{
			responseSecret = item;
		}
		else
		{
			FileCertificate.WriteLine(item);
		}
	}

	FileCertificate.Close();

	return responseSecret;
}
catch (Exception ex)
{
	throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + ex.Message );
}
finally
{
	if (myWriter != null)
	myWriter.Close();
}

}

	var requestResponse = (HttpWebResponse)request.GetResponse();

	response = new StreamReader(requestResponse.GetResponseStream()).ReadToEnd();

	StreamWriter FileCertificate;
	FileCertificate = File.CreateText(
		@"C:\caminho_certificado\ARQUIVO_REQUEST_CERTIFICADO.crt"
	);

	StringReader stringReader = new StringReader(getRetorno());
	var teste = response.Split(Environment.NewLine.ToCharArray());

	foreach (var item in teste)
	{
		if (item.Contains("Secret:"))
		{
			responseSecret = item;
		}
		else
		{
			FileCertificate.WriteLine(item);
		}
	}

	FileCertificate.Close();

	return responseSecret;
}
catch (Exception ex)
{
	throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + ex.Message );
}
finally
{
	if (myWriter != null)
	myWriter.Close();
}

}

veja na prática como enviar o certificado dinâmico (CSR) via cURL:

Confira nosso tutorial!

Vídeo 03 - O vídeo acima demonstra os passos na prática de como enviar o certificado dinâmico (CSR) via cURL.

Importante:

  • Caso o desenvolvimento utilize Microsoft .NET Framework, como por exemplo C#, recomendamos a utilização da classe HttpWebRequest ao invés da classe System.Net.Http.HttpClient. Mais informações no site oficial da Microsoft.

  • Caso receba o parâmetro x-itau-client-cert-error no header do response, significa que a chamada foi rejeitada por conta do certificado. Veja mais detalhes ao final desta documentação, na seção de códigos de retorno da chamada do envio do certificado.

Parabéns! Você já tem em mãos o client_secret e seu Certificado Dinâmico emitido pelo Itaú, agora você já pode começar a consumir nossas APIs.

Importante: Para os endpoints api.itau.com.br, sts.itau.com.br, secure.api.itau e secure.api.cloud.itau.com.br deverá ser enviado o certificado em todas as requisições.

No entanto, caso tenha dúvidas sobre qual utilizar, acione o time Comercial ou o time de Implantação técnica e sinalize seu ponto focal no Itaú.

Mas caso prefira, também é possível entrar em contato por meio do formulário fale com a gente.


renovar o certificado dinâmico

Existem duas formas para renovar o certificado dinâmico:

  • A primeira ocorre quando o certificado encontra-se válido, dentro do prazo de validade de 365 dias.

  • A segunda ocorre quando o certificado expirou, após o prazo de validade de 365 dias.

Nos tópicos a seguir, exploraremos ambas as opções e os processos envolvidos em cada uma delas.

1 - renovar um certificado ainda válido dentro do prazo de validade

Se você já é um usuário, porém, quer renovar seu certificado dinâmico mesmo tendo um certificado ainda válido, ou seja, sem ter expirado o prazo de 365 dias do seu arquivo .CRT, basta seguir as instruções a seguir:

  1. Não é necessário gerar novas credenciais (client_ID e client_secret), recomendamos que utilize suas credenciais descriptografadas já existentes geradas anteriormente, caso não as tenha em mãos, solicite ao seu ponto focal do Itaú;

  2. Solicite um novo access_token por meio de requisição ao STS Itaú, cuja validade é de 5 minutos, caso expire solicite novamente;

  3. Gerar o novo certificado dinâmico (.CRT): com as credenciais descriptografadas e o access_token em mãos, siga o Passo 7 – passo a passo para gerar o certificado dinâmico.

Importante: Não é possível renovar o certificado dinâmico antes de 60 dias que antecedem a data de expiração, podendo ocasionar o erro C700. Certifique-se de iniciar o processo de renovação dentro desse período para garantir a continuidade dos serviços e evitar interrupções indesejadas.

Para mais informações sobre o erro C700 e demais retornos, acesse o tópico códigos de retorno da chamada do envio do certificado.

2 - renovar um certificado expirado após o prazo de validade

Se você já é um usuário, porém, detém um certificado dinâmico expirado, ou seja, decorreu o prazo de validade de 365 dias do seu arquivo .CRT, é necessário gerar um novo certificado dinâmico, basta seguir as instruções abaixo:

  1. Não é necessário gerar novas credenciais (client_ID e client_secret), recomendamos que utilize suas credenciais descriptografadas já existentes geradas anteriormente, caso não as tenha em mãos, solicite ao seu ponto focal do Itaú;

  2. Solicite um novo token temporário ao seu ponto focal do Itaú que lhe enviará por e-mail um token criptografado, cuja validade é de 7 dias corridos. Caso expire, solicite novamente;

  3. Copie o token temporário que você recebeu por e-mail do seu ponto focal e realize o processo do Passo 6 – Descriptografar as credenciais (role a documentação para baixo) para descriptografa-lo;

  4. Agora, basta gerar um novo certificado dinâmico (.CRT): com as credenciais descriptografadas e o token temporário em mãos, siga a partir do Passo 7 – passo a passo para gerar o certificado dinâmico.


códigos de retorno da chamada do envio do certificado

Código

Motivo

Ação

C100

Ausência do certificado na chamada

Verifique se o certificado está sendo enviado para o destino.

C200

Certificado inválido

Verifique se o certificado foi enviado corretamente ou se está ativo.

C300

Certificado inválido

Verifique se o certificado foi emitido corretamente.

C400

Cadeia certificadora: ## é inválida. O certificado NÃO foi emitido pelo STS.

Emita um certificado válido.

C500

Certificado expirado. Data de expiração: ##

Emita um novo certificado caso ainda não tenha renovado.

C600

O Common Name (CN): ## do certificado é inválido.

Verifique se o CN do subject da geração do CSR é exatamente igual ao client_id e emita um novo certificado.

C700

O certificado ainda está valido. Renovação não permitida fora do prazo de 60 dias antes do vencimento.

Utilize o certificado vigente.

C700a

O certificado ainda está valido. A emissão de um novo não é permitida.

Utilize o certificado vigente.

C800

O CSR (Certificate Sign Request) enviado é inválido.

Verifique se o CSR está sendo enviado corretamente.

C800a

O Common Name (CN) do CSR (Certificate Sign Request) enviado é inválido.

Verifique se o CN do subject da geração do CSR é exatamente igual ao client_id e tente novamente.

C800b

Limite de certificados excedido para o token atual

Solicite um novo token temporario

C900

Erro ao revogar o certificado

Entre em contato com o suporte.

C900a

Erro ao revogar certificado. Permissão negada.

Verifique se o usuário tem permissão e tente novamente.

C900b

Erro ao revogar certificado de Parceiro. Permissão negada.

Entre em contato com o suporte.

C1000

Erro desconhecido durante emissão do certificado.

Entre em contato com o suporte

Dica: Para dúvidas que não forem esclarecidas por essa documentação, entre em contato conosco diretamente pelos canais de suporte combinados com o seu representante comercial Itaú.