[Java] Desabilitando paliativamente o SSL de uma conexão com o MySQL para evitar o seguinte erro: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer’s close_notify

mysql

** BEGIN NESTED EXCEPTION ** 

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

STACKTRACE:

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
	at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645)
	at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624)
	at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:2249)
	at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4221)
	at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1464)
	at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:135)
	at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection$1(HikariPool.java:441)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)


** END NESTED EXCEPTION **

Solução paliativa:

Alterar a String de conexão com o banco de dados e adicionar o parametro `useSSL` como false:

spring.datasource.url=jdbc:mysql://localhost:3306/database?useSSL=false

https://stackoverflow.com/a/55193187/10512799

Solução adequada:

A solução adequada seria configurar sua conexão com o banco de dados de forma segura utilizando o SSL, segue alguns links úteis:

https://www.techrunnr.com/connect-mysql-server-from-spring-boot-application-with-ssl/

https://stackoverflow.com/questions/43635449/how-to-configure-spring-boot-application-to-use-ssl-tls-over-mysql?rq=1

 

[TomCat] [Spring] Como definir o ‘spring.profiles.active’ de uma aplicação Spring no Tomcat

spring-boot

Quando trabalhamos com aplicações desenvolvidas com o Framework Spring Boot é normal utilizarmos os ‘profiles‘ para definir o ambiente que estamos trabalhando, os profiles são muito utilizados para carregar os resources utilizados na aplicação, permitindo uma variedade de ambientes, como testes, desenvolvimento, produção, etc.

O Spring Boot permite que implementemos uma solução já com um servidor de aplicação embutido, mas também nos permite gerar um .war e subirmos em nosso próprio servidor de aplicação, quando temos um jar, para executarmos a aplicação com um profile especifico, basta inserirmos os argumentos na execução, exemplo:

java -Dspring.profiles.active=prod -jar MyApp.jar

Mas como fazemos isso em um servidor de aplicação? aonde normalmente só realizamos o deploy do .war?. Quando temos esse tipo de ambiente temos que configurar o nosso servidor de aplicação para que ele possua esses argumentos, assim, as devidas váriaveis estaram definidas na VM e a solução terá acesso a elas.

A solução é simples, no caso do Tomcat quem se responsabiliza em gerenciar sua execução é um arquivo chamado catalina.sh armazenado na pasta /bin, todas as configurações do servidor de aplicação devem ser configurados nesse arquivo. Para adicionarmos um VM’args no caso o `spring.profiles.active` vamos editar esse arquivo e adicionar na variável CATALINA_OPTS seu valor.

Segue a alteração que deve ser feita no catalina.sh: Continue reading

[JAVA / MAVEN] – Projeto de exemplo de um Archetype em Java (How to create archetype – project sample)

add_archetype

Helpdev Archetype

Esse projeto pode ser utilizado como exemplo para criar seu próprio archetype, ele contém configurações de como criar uma classe com nome dinâmico, como criar variáveis para ser substituídas no código, importar README, .gitignore etc.

Especificamente nesse projeto o archetype foi definido para criar uma estrutura de pastas padronizados, criar uma Main class com o nome do projeto tudo dentro do package adequado ( group id + artifact id ), de acordo com necessidades de projetos em produção ele também cria uma pasta externa de properties com um arquivo contendo o artifact id como nome.

https://github.com/gbzarelli/archetype-java

https://github.com/gbzarelli/archetype-spring

Java / JVM – Trabalhando com a Variável de Ambiente LD_LIBRARY_PATH

java

A variável de ambiente LD_LIBRARY_PATH informa aos aplicativos do Linux, como a JVM, onde localizar bibliotecas compartilhadas quando elas estão localizadas em um diretório diferente do diretório especificado na seção do cabeçalho do programa.

As bibliotecas compartilhadas para o SDK estão em /usr/java7/jre/lib// e /usr/java7/jre/lib//j9vm, em que é um dos seguintes:
Linux PPC de 32 bits: ppc
Linux PPC de 64 bits: ppc64
Linux 390 de 31 bits: s390
Linux 390 de 64 bits: s390x
Linux de 32 bits: i386
Linux de 64 bits: amd64
Os programas ativadores do SDK, incluindo java, javac e jar procuram esses diretórios automaticamente. O diretório-pai é geralmente /usr/java7/, mas os pacotes que empacotam o Java™ podem usar diretórios diferentes. Este caminho já está configurado pelos programas ativadores deJava tais como java, javac ou jar.

Configure LD_LIBRARY_PATH se uma das seguintes condições se aplicar:
Você estiver utilizando outras bibliotecas compartilhadas (incluindo as bibliotecas nativas JNI que você utiliza ou desenvolve). Configure LD_LIBRARY_PATH para incluir o diretório ou diretórios que contêm as bibliotecas.
Você estiver usando a API de Chamada de JNI para chamar o código Java a partir do aplicativo C/C++. Configure LD_LIBRARY_PATH para incluir os diretórios que contém as bibliotecas JVM além dos diretórios que contêm suas próprias bibliotecas.

Fonte: https://www.ibm.com/support/knowledgecenter/pt-br/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/user/setlpath.html

Java – Retirando a implementação do SLF4J de dependências

java Se você estiver utilizando alguma biblioteca em seu sistema que contenha alguma implementação do SLF4J , você pode retirar a mesma utilizando a dependência do SLF4J ‘slf4j-nop’ (non-operation). Um dos motivos para retira-lo é estar logando na System.out do sistema informações de log. Para retirar basta incluir a seguinte dependência:

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.25</version>
        </dependency>

Java / .Net – SourceAFIS – Biblioteca de reconhecimento de impressões digitais – (Fingerprint recognition library)

fingerprint

SourceAFIS

for Java and .NET

SourceAFIS é um algoritmo que reconhece impressões digitais humanas. Ele pode comparar duas impressões digitais 1: 1 ou pesquisar um grande banco de dados 1: N para impressão digital correspondente. Ele pega imagens de impressões digitais na entrada e produz uma pontuação de similaridade na saída. A pontuação de similaridade é então comparada com o limite de correspondência personalizável.

O algoritmo SourceAFIS tem duas implementações de código aberto quase idênticas em Java puro e .NET puro. API SourceAFIS é projetado para máxima simplicidade e facilidade de uso por desenvolvedores de aplicativos. Precisão e velocidade de correspondência são suficientes para a maioria das aplicações..

Algorithm

O algoritmo SourceAFIS é o resultado do design de algoritmo independente. Não apenas copia algum algoritmo de livro didático. No entanto, ele empresta muito de outros correspondentes de impressões digitais de código aberto. Ele oferece precisão decente e velocidade de correspondência surpreendentemente alta.

O SourceAFIS, sendo o opensource, fornece um recurso muito raro de transparência de algoritmo que expõe estruturas de dados intermediárias computadas pelo algoritmo durante a correspondência de impressões digitais, o que abre a porta para aplicativos interessantes que antes eram impossíveis com os correspondentes comerciais.

A implementação open source do algoritmo combinado com a licença permissiva pode ser explorada para o desenvolvimento de modificações customizadas interessantes no algoritmo por qualquer um com algum tempo de sobra. Alterações no algoritmo também podem ser implementadas pelo autor do SourceAFIS como um projeto de desenvolvimento customizado e acessível.

https://sourceafis.machinezoo.com/