Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Problema com requisições https

Olá Configurei a minha API para receber requisições https através de um certificado self-signed. Quando faço a requisição via postman está funcionando corretamente, porém temos uma aplicação front-end que também possui um certificado válido SSL, apresenta problemas ao realizar as mesmas requisições. Segue o erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeConfigurei a API da seguinte forma:

application.properties

#server port
server.port=5001
        

server.ssl.key-alias=https-example
server.ssl.key-store=classpath:https-example.jks
server.ssl.key-store-type=JKS
server.ssl.key-password=xxxxx
server.ssl.enabled=true

SSOApplication

@Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();

        // HTTP Connector
        Connector httpConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        httpConnector.setScheme("http");
        httpConnector.setPort(5002); // HTTP port
        tomcat.addAdditionalTomcatConnectors(httpConnector);


        // HTTPS Connector
        Connector httpsConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        httpsConnector.setScheme("https");
        httpsConnector.setSecure(true);
        httpsConnector.setPort(443); // HTTPS port
        httpsConnector.setAttribute("keystoreFile", "src/main/resources/https-example.jks");
        httpsConnector.setAttribute("keystorePass", "xxxx");
        httpsConnector.setAttribute("keyAlias", "https-example");
        tomcat.addAdditionalTomcatConnectors(httpsConnector);

        return tomcat;
    }
4 respostas

Olá Raphael,

Pelo erro apresentado na imagem, parece que a aplicação front-end não está confiando no certificado self-signed que você configurou para a sua API. O erro net::ERR_CERT_AUTHORITY_INVALID indica que o navegador ou a biblioteca HTTP que está sendo usada para fazer a requisição não reconhece a autoridade que emitiu o certificado como confiável.

Como você mencionou que a aplicação front-end possui um certificado SSL válido, a aplicação cliente provavelmente está configurada para aceitar apenas certificados de Autoridades Certificadoras (CAs) reconhecidas. Certificados self-signed não são emitidos por uma CA reconhecida e, portanto, não são confiáveis por padrão.

Existem algumas abordagens que você pode considerar para resolver esse problema:

  1. Adicionar o certificado self-signed à lista de exceções do navegador/cliente: Isso pode ser feito manualmente em cada navegador ou cliente que precisa acessar a API. No entanto, essa não é uma solução escalável e pode ser um risco de segurança.

  2. Usar um certificado emitido por uma Autoridade Certificadora: Se a sua API está sendo acessada em um ambiente de produção, o ideal seria obter um certificado de uma CA reconhecida. Serviços como Let's Encrypt oferecem certificados gratuitos e são amplamente aceitos pelos navegadores e clientes HTTP.

  3. Configurar o cliente para confiar no certificado self-signed: Se você está em um ambiente de desenvolvimento e precisa que a aplicação front-end confie no certificado self-signed, você pode configurar o cliente HTTP da aplicação front-end para aceitar o certificado self-signed. Isso geralmente é feito importando o certificado para o armazenamento de certificados do cliente ou passando o certificado diretamente para a biblioteca HTTP.

  4. Desabilitar a verificação de certificado no cliente: Esta é uma opção apenas para ambientes de desenvolvimento e teste, pois desabilita completamente a verificação de segurança do SSL. Isso não deve ser feito em produção.

Como você está trabalhando com uma aplicação front-end, a solução mais adequada dependerá da biblioteca ou framework que você está usando para fazer as requisições HTTP. Por exemplo, se você estiver usando o Axios em um aplicativo React, você poderia configurar o Axios para aceitar o certificado self-signed. No entanto, isso deve ser feito com cautela e apenas em ambientes de desenvolvimento.

Espero ter ajudado e bons estudos!

Olá Rodrigo. Obrigado pelo retorno. Eu coloquei o mesmo certificado que está no front na API. Tentei gerando o arquivo tanto do tipo .jks quanto .p12 e instalei na minha máquina. Ao substituir no projeto spring boot ocorreu um erro e o projeto não subiu.

Segue o erro:

Caused by: java.lang.IllegalArgumentException: jsse.alias_no_key_entry
solução!

Entendi. O erro "jsse.alias_no_key_entry" geralmente ocorre quando o alias especificado no arquivo de keystore não corresponde a uma entrada de chave. Isso pode acontecer por várias razões, como um alias incorreto ou o arquivo de keystore contém apenas certificados sem chaves privadas correspondentes.

Para corrigir esse erro, siga estas etapas:

Verifique o alias correto: Verifique se o alias especificado no arquivo de propriedades corresponde ao alias usado no keystore. Certifique-se de que você está usando o alias correto ao configurar o keystore no Spring Boot.

Verifique o conteúdo do keystore: Verifique se o keystore contém a chave privada correspondente ao certificado SSL. O alias especificado no arquivo de propriedades deve ser o mesmo que o alias usado ao importar o certificado no keystore.

Verifique o tipo de arquivo de keystore: Certifique-se de que o tipo de arquivo de keystore (JKS ou PKCS12) corresponde ao tipo especificado na configuração do Spring Boot. Se você estiver usando um arquivo .jks, a propriedade server.ssl.key-store-type deve ser configurada como JKS. Se estiver usando um arquivo .p12, a propriedade deve ser configurada como PKCS12.

Verifique a senha do keystore: Certifique-se de que a senha especificada na configuração do Spring Boot corresponde à senha usada para proteger o keystore.

Eu consegui resolver o problema colocando o mesmo certificado válido que está no frontend, no backend

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software