Introdução
Como contornar o erro "Received fatal alert: bad_record_mac" Layout 4.0?
Passo a passo
Recentemente o Lucas Goedert identificou um problema ao enviar notas com layout 4.0 utilizando o Java 8 para a sefaz de Goiás, onde a nota não era autorizada e devolvia o seguinte erro:
Foi analisado o problema e identificado que quando uma conexão é estabelecida, o cliente e o servidor negociam a cifra* a utilizar para a conexão. O servidor tem uma lista ordenada de cifras e a primeira cifra na lista que é suportada pelo cliente é selecionada, ou seja nós enviamos ao servidor quais cifras nós aceitamos e ele pega a primeira que ele também trabalha (esse é o famoso Handshake), porem ao utilizar o Java 8 a lista de cifras é diferente da utilizada pelo Java 7 pois no Java 8 o protocolo de segurança default é o TLSv1.2 e no Java 7 é o TLSv1.0.
Para resolução deste problema devemos forçar o protocolo a ser utilizado para TLSv1.1 utilizando o parâmetro protocol=TLSv1.1 no properties do concentrador (Disponível na versão 4.8.8.0 em diante), caso a sefaz em questão não aceite o TLSv1.1 devemos então forçar o uso de determinada cifra utilizando o parâmetro ciphersuites= SSL_RSA_WITH_3DES_EDE_CBC_SHA ou algum outro que seja aceito nas duas pontas, para identificar podemos habilitar o modo debug dessa comunicação (System.setProperty(“javax.net.debug”, “all”) no eclipse) com isso é possível ver qual cifra o servidor permite e qual cifra nós estamos mandando.
*Exemplo de Cifras: SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_WITH_RC4_128_MD5, etc…
Fonte:
https://blogs.sap.com/2013/12/18/sefaz-sp-cifras-ssl/
https://blogs.oracle.com/java-platform- … as-default
http://www.ateam-oracle.com/tls-and-java/
Outras informações
Fonte: Rainmakers Team