From c3b18febfeacf645c0b77e42e865306c1e918fd3 Mon Sep 17 00:00:00 2001
From: "jardel.novaes"
Date: Sat, 13 Jul 2024 16:14:59 -0300
Subject: [PATCH 1/3] Tratamento de certificados na camada TLS/SSL em
multithreading
---
.../certificado/Certificado.java | 2 +
.../certificado/CertificadoService.java | 91 ++++++++++++++-----
.../certificado/CertificadoServiceTest.java | 36 ++++++++
3 files changed, 104 insertions(+), 25 deletions(-)
diff --git a/src/main/java/br/com/swconsultoria/certificado/Certificado.java b/src/main/java/br/com/swconsultoria/certificado/Certificado.java
index d7067ce..db41175 100644
--- a/src/main/java/br/com/swconsultoria/certificado/Certificado.java
+++ b/src/main/java/br/com/swconsultoria/certificado/Certificado.java
@@ -32,9 +32,11 @@ public class Certificado {
private String sslProtocol;
private BigInteger numeroSerie;
private Provider provider;
+ private boolean modoAntigoSSL;
public Certificado() {
this.setSslProtocol(TLSV_1_2);
+ this.setModoAntigoSSL(true); //TODO Temporariamente o padrão será true, até validação do Bruno S.
}
@Override
diff --git a/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java b/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
index 86b5e76..bdd7544 100644
--- a/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
+++ b/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
@@ -3,6 +3,7 @@
import br.com.swconsultoria.certificado.exception.CertificadoException;
import br.com.swconsultoria.certificado.util.DocumentoUtil;
import lombok.extern.java.Log;
+import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.protocol.Protocol;
import java.io.FileNotFoundException;
@@ -36,34 +37,25 @@ public static void inicializaCertificado(Certificado certificado) throws Certifi
}
public static void inicializaCertificado(Certificado certificado, InputStream cacert) throws CertificadoException {
+ if (certificado == null) {
+ throw new IllegalArgumentException(CERTIFICADO_NAO_PODE_SER_NULO);
+ }
- try {
-
- KeyStore keyStore = getKeyStore(
- Optional.ofNullable(certificado).orElseThrow(() -> new IllegalArgumentException(CERTIFICADO_NAO_PODE_SER_NULO)));
- SocketFactoryDinamico socketFactory = new SocketFactoryDinamico(keyStore, certificado.getNome(), certificado.getSenha(),
- Optional.ofNullable(cacert).orElseThrow(() -> new IllegalArgumentException("Cacert não pode ser nulo.")),
- certificado.getSslProtocol());
- Protocol protocol = new Protocol("https", socketFactory, 443);
- Protocol.registerProtocol("https", protocol);
-
- log.info(String.format("JAVA-CERTIFICADO | Samuel Oliveira | samuel@swconsultoria.com.br " +
- "| VERSAO=%s | DATA_VERSAO=%s | CNPJ/CPF=%s | VENCIMENTO=%s | ALIAS=%s | TIPO=%s | CAMINHO=%s | CACERT=%s | SSL=%s",
- "3.7",
- "11/07/2024",
- certificado.getCnpjCpf(),
- certificado.getDataHoraVencimento(),
- certificado.getNome().toUpperCase(),
- certificado.getTipoCertificado().toString(),
- certificado.getArquivo(),
- cacertProprio ? "Default" : "Customizado",
- certificado.getSslProtocol()));
-
- } catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException | CertificateException |
- IOException e) {
- throw new CertificadoException(e.getMessage(), e);
+ if (certificado.isModoAntigoSSL()) {
+ Protocol.registerProtocol("https", getProtocoloCertificado(certificado, cacert));
}
+ log.info(String.format("JAVA-CERTIFICADO | Samuel Oliveira | samuel@swconsultoria.com.br " +
+ "| VERSAO=%s | DATA_VERSAO=%s | CNPJ/CPF=%s | VENCIMENTO=%s | ALIAS=%s | TIPO=%s | CAMINHO=%s | CACERT=%s | SSL=%s",
+ "3.7",
+ "11/07/2024",
+ certificado.getCnpjCpf(),
+ certificado.getDataHoraVencimento(),
+ certificado.getNome().toUpperCase(),
+ certificado.getTipoCertificado().toString(),
+ certificado.getArquivo(),
+ cacertProprio ? "Default" : "Customizado",
+ certificado.getSslProtocol()));
}
public static Certificado certificadoPfxBytes(byte[] certificadoBytes, String senha) throws CertificadoException {
@@ -278,4 +270,53 @@ public static Certificado getCertificadoByCnpjCpf(String cnpjCpf) throws Certifi
cnpjCpf));
}
+ private static Protocol getProtocoloCertificado(final Certificado certificado, InputStream cacert) throws CertificadoException {
+ try {
+ KeyStore keyStore = getKeyStore(
+ Optional.ofNullable(certificado).orElseThrow(() -> new IllegalArgumentException(CERTIFICADO_NAO_PODE_SER_NULO)));
+ SocketFactoryDinamico socketFactory = new SocketFactoryDinamico(keyStore, certificado.getNome(), certificado.getSenha(),
+ Optional.ofNullable(cacert).orElseThrow(() -> new IllegalArgumentException("Cacert não pode ser nulo.")),
+ certificado.getSslProtocol());
+
+ return new Protocol("https", socketFactory, 443);
+
+ } catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException | CertificateException |
+ IOException e) {
+ throw new CertificadoException(e.getMessage(), e);
+ }
+ }
+
+
+ //FIXME Validar Samuel: Talvez não seja aqui o melhor local, coloquei inicialmente porque é acessível de todos que consomem a lib de certificado.
+ /**
+ * Utiliza cacert default da biblioteca.
+ * @see #getHttpsClient(Certificado, String, InputStream)
+ */
+ public static HttpClient getHttpsClient(Certificado certificado, String url) throws CertificadoException {
+ return getHttpsClient(certificado, url, CertificadoService.class.getResourceAsStream("/cacert"));
+ }
+
+ /**
+ * Utilizar o {@link org.apache.commons.httpclient.HttpClient} gerado nesse método para evitar conflitos de
+ * certificados nas conexões HTTPS/TLS/SSL, especialmente em ambientes multithread.
+ *
+ * O consumidor desse método deverá usar esse cliente no stub desejado
+ * exemplo:
+ *
+ * HttpClient client = getHttpsClient(certificado, url);
+ * NFeStatusServico4Stub stub = new NFeStatusServico4Stub(url);
+ * stub._getServiceClient().getOptions().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpclient);
+ *
+ * @param certificado {@link Certificado} a ser utilizado na conexão.
+ * @param url {@link String} a ser executada na conexão https
+ * @param cacert {@link java.io.InputStream} contendo o cacert
+ * @return {@link org.apache.commons.httpclient.HttpClient} configurado para a URL e Certificados informados.
+ * @throws CertificadoException
+ */
+ public static HttpClient getHttpsClient(Certificado certificado, String url, final InputStream cacert) throws CertificadoException {
+ Protocol protocol = getProtocoloCertificado(certificado, cacert);
+ HttpClient httpclient = new HttpClient();
+ httpclient.getHostConfiguration().setHost(url, 443, protocol);
+ return httpclient;
+ }
}
diff --git a/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java b/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java
index d3d2700..44c45e5 100644
--- a/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java
+++ b/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java
@@ -4,12 +4,18 @@
import br.com.swconsultoria.certificado.util.DocumentoUtil;
import mockit.Mock;
import mockit.MockUp;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Field;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -207,4 +213,34 @@ void extraiCpfCnpjCorretamente() {
}
+ /**
+ * Testa a compatibilidade com consumidores "antigos", que ainda não estão no "novo modelo" de controle do
+ * certificado nas conexões TLS/SSL. Isso permitirá uma "migração gradual" dos consumidores.
+ * Por padrão será utilizado o novo modo, cada consumidor irá precisar explicitamente escolher o "modo antigo SSL",
+ * caso deseje.
+ */
+ @Test
+ void compatibilidadeComModoAntigoSSL() throws FileNotFoundException, CertificadoException {
+ Certificado certificado = CertificadoService.certificadoPfx(CERTIFICADO_CPF, SENHA);
+ certificado.setModoAntigoSSL(true);
+ CertificadoService.inicializaCertificado(certificado);
+
+ String alias = getHttpsProtocoloAlias("https");
+
+ assertEquals("certificado cpf teste", alias);
+ }
+
+ private String getHttpsProtocoloAlias(String protocolId) {
+ try {
+ Protocol registeredProtocol = Protocol.getProtocol(protocolId);
+ ProtocolSocketFactory factory = registeredProtocol.getSocketFactory();
+
+ Class> clazz = factory.getClass();
+ Field getAliasField = clazz.getDeclaredField("alias");
+ getAliasField.setAccessible(true);
+ return (String) getAliasField.get(factory);
+ } catch (Exception e) {
+ return null;
+ }
+ }
}
\ No newline at end of file
From 3562585bc2b41286127aec68e988786e05df9bc3 Mon Sep 17 00:00:00 2001
From: "jardel.novaes"
Date: Sat, 12 Oct 2024 11:14:56 -0300
Subject: [PATCH 2/3] Tratamento de certificados na camada TLS/SSL em
multithreading - Ajustes Code Review
---
.../certificado/Certificado.java | 4 +--
.../certificado/CertificadoService.java | 21 ++++++++++++---
.../certificado/CertificadoServiceTest.java | 26 +++++++------------
3 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/src/main/java/br/com/swconsultoria/certificado/Certificado.java b/src/main/java/br/com/swconsultoria/certificado/Certificado.java
index db41175..02ef09d 100644
--- a/src/main/java/br/com/swconsultoria/certificado/Certificado.java
+++ b/src/main/java/br/com/swconsultoria/certificado/Certificado.java
@@ -32,11 +32,11 @@ public class Certificado {
private String sslProtocol;
private BigInteger numeroSerie;
private Provider provider;
- private boolean modoAntigoSSL;
+ private boolean isModoMultithreading;
public Certificado() {
this.setSslProtocol(TLSV_1_2);
- this.setModoAntigoSSL(true); //TODO Temporariamente o padrão será true, até validação do Bruno S.
+ this.setModoMultithreading(false);
}
@Override
diff --git a/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java b/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
index bdd7544..f84c3c4 100644
--- a/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
+++ b/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
@@ -36,12 +36,27 @@ public static void inicializaCertificado(Certificado certificado) throws Certifi
inicializaCertificado(certificado, CertificadoService.class.getResourceAsStream("/cacert"));
}
+ /**
+ *
+ * Inicializa o certificado para a conexão SSL/TLS.
+ * Importante: Quando NÃO estiver com o modo multithreading ativado (certificado.isModoMultithreading())
+ * será registrado e utilizado um único certificado em todas as conexões até a próxima chamada à
+ * {@link #inicializaCertificado(Certificado, InputStream)}. É o modo antigo e padrão da biblioteca.
+ * Quando estiver com o modo multithreading ativo o consumidor deverá obter um
+ * {@link org.apache.commons.httpclient.HttpClient} com protocolo e certificado exclusivos para ele usando o
+ * método {@link #getHttpsClient(Certificado, String, InputStream)}
+ *
+ * @param certificado {@link Certificado} a ser utilizado na conexão.
+ * @param cacert {@link java.io.InputStream} contendo o cacert
+ * @throws CertificadoException
+ */
+
public static void inicializaCertificado(Certificado certificado, InputStream cacert) throws CertificadoException {
if (certificado == null) {
throw new IllegalArgumentException(CERTIFICADO_NAO_PODE_SER_NULO);
}
- if (certificado.isModoAntigoSSL()) {
+ if (!certificado.isModoMultithreading()) {
Protocol.registerProtocol("https", getProtocoloCertificado(certificado, cacert));
}
@@ -286,8 +301,6 @@ private static Protocol getProtocoloCertificado(final Certificado certificado, I
}
}
-
- //FIXME Validar Samuel: Talvez não seja aqui o melhor local, coloquei inicialmente porque é acessível de todos que consomem a lib de certificado.
/**
* Utiliza cacert default da biblioteca.
* @see #getHttpsClient(Certificado, String, InputStream)
@@ -298,7 +311,7 @@ public static HttpClient getHttpsClient(Certificado certificado, String url) thr
/**
* Utilizar o {@link org.apache.commons.httpclient.HttpClient} gerado nesse método para evitar conflitos de
- * certificados nas conexões HTTPS/TLS/SSL, especialmente em ambientes multithread.
+ * certificados nas conexões HTTPS/TLS/SSL, especialmente em ambientes multithreading.
*
* O consumidor desse método deverá usar esse cliente no stub desejado
* exemplo:
diff --git a/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java b/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java
index 44c45e5..899c27f 100644
--- a/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java
+++ b/src/test/java/br/com/swconsultoria/certificado/CertificadoServiceTest.java
@@ -4,12 +4,9 @@
import br.com.swconsultoria.certificado.util.DocumentoUtil;
import mockit.Mock;
import mockit.MockUp;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.io.FileNotFoundException;
@@ -33,11 +30,11 @@
class CertificadoServiceTest {
- private final String CERTIFICADO_CPF = "NaoUsar_CPF.pfx";
- private final String CERTIFICADO_CNPJ = "NaoUsar_CNPJ.pfx";
- private final String CPF = "99999999999";
- private final String CNPJ = "99999999999999";
- private final String SENHA = "123456";
+ private static final String CERTIFICADO_CPF = "NaoUsar_CPF.pfx";
+ private static final String CERTIFICADO_CNPJ = "NaoUsar_CNPJ.pfx";
+ private static final String CPF = "99999999999";
+ private static final String CNPJ = "99999999999999";
+ private static final String SENHA = "123456";
@Test
void certificadoPfxParametroNull() {
@@ -178,10 +175,7 @@ void inicaConfiguracoesCorretamente() {
}
@Test
- void inicaConfiguracoesParametrosNull() throws IOException, CertificadoException {
-
- InputStream cacert = CertificadoServiceTest.class.getResourceAsStream("cacert");
- Certificado certificado = CertificadoService.certificadoPfx(CERTIFICADO_CNPJ, SENHA);
+ void inicaConfiguracoesParametrosNull() {
//Certificado Null
Assertions.assertThrows(IllegalArgumentException.class, () ->
@@ -216,13 +210,13 @@ void extraiCpfCnpjCorretamente() {
/**
* Testa a compatibilidade com consumidores "antigos", que ainda não estão no "novo modelo" de controle do
* certificado nas conexões TLS/SSL. Isso permitirá uma "migração gradual" dos consumidores.
- * Por padrão será utilizado o novo modo, cada consumidor irá precisar explicitamente escolher o "modo antigo SSL",
- * caso deseje.
+ * Por padrão será utilizado o modo antigo, cada consumidor irá precisar explicitamente escolher o
+ * "modo multithreading", caso deseje.
*/
@Test
- void compatibilidadeComModoAntigoSSL() throws FileNotFoundException, CertificadoException {
+ void compatibilidadeModoMultithreadingDesativado() throws FileNotFoundException, CertificadoException {
Certificado certificado = CertificadoService.certificadoPfx(CERTIFICADO_CPF, SENHA);
- certificado.setModoAntigoSSL(true);
+ certificado.setModoMultithreading(false);
CertificadoService.inicializaCertificado(certificado);
String alias = getHttpsProtocoloAlias("https");
From 4c742c99d15c440a8e9bcca0181769453e766999 Mon Sep 17 00:00:00 2001
From: SamuelOliveira
Date: Mon, 14 Oct 2024 14:13:14 -0300
Subject: [PATCH 3/3] Finalizado versao 3.8
---
CHANGELOG.md | 1 +
cacert | Bin 419363 -> 423001 bytes
.../certificado/CertificadoService.java | 9 +++++----
src/main/resources/cacert | Bin 419363 -> 423001 bytes
4 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 86084de..884b05a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,2 +1,3 @@
# Notas de versão
- Atualizado CACERT
+- Adicionado modo Multithreading
diff --git a/cacert b/cacert
index 5c23517384c12c685cd0db46cac3bc2fbfe0ff7f..ada2f805e53472ebc49e15b52e40351c4632d1ad 100644
GIT binary patch
delta 40037
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
nye>43f?7qV2;}fWGZt7ScamAUnFND
delta 40519
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
Zonu1DEvPHfmHZU;D?dCTz1XOm@ISEvr%(U@
diff --git a/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java b/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
index f84c3c4..4de4936 100644
--- a/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
+++ b/src/main/java/br/com/swconsultoria/certificado/CertificadoService.java
@@ -61,16 +61,17 @@ public static void inicializaCertificado(Certificado certificado, InputStream ca
}
log.info(String.format("JAVA-CERTIFICADO | Samuel Oliveira | samuel@swconsultoria.com.br " +
- "| VERSAO=%s | DATA_VERSAO=%s | CNPJ/CPF=%s | VENCIMENTO=%s | ALIAS=%s | TIPO=%s | CAMINHO=%s | CACERT=%s | SSL=%s",
- "3.7",
- "11/07/2024",
+ "| VERSAO=%s | DATA_VERSAO=%s | CNPJ/CPF=%s | VENCIMENTO=%s | ALIAS=%s | TIPO=%s | CAMINHO=%s | CACERT=%s | SSL=%s | Multithreading=%s",
+ "3.8",
+ "14/10/2024",
certificado.getCnpjCpf(),
certificado.getDataHoraVencimento(),
certificado.getNome().toUpperCase(),
certificado.getTipoCertificado().toString(),
certificado.getArquivo(),
cacertProprio ? "Default" : "Customizado",
- certificado.getSslProtocol()));
+ certificado.getSslProtocol(),
+ certificado.isModoMultithreading()));
}
public static Certificado certificadoPfxBytes(byte[] certificadoBytes, String senha) throws CertificadoException {
diff --git a/src/main/resources/cacert b/src/main/resources/cacert
index 5c23517384c12c685cd0db46cac3bc2fbfe0ff7f..ada2f805e53472ebc49e15b52e40351c4632d1ad 100644
GIT binary patch
delta 40037
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