Gerar certificado dinâmico Itaú
Requisitos
Para a geração do certificado dinâmico, é necessário ser instalado:
- OpenSLL - Precisamos dele para rodar alguns comandos.
- GitBash - Terminal utilizado para escrever os comandos.
- Java - Necessário para rodar alguns scripts de código.
- 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.