Como resolver javax.net.ssl.SSLHandshakeException Erro?

Conectei-me à VPN para configurar a API de inventário para obter uma lista de produtos e ela funciona bem. Assim que obtiver o resultado do serviço da web e ligar à interface do usuário. E também integrei o PayPal ao meu aplicativo para fazer o check-out expresso quando faço uma chamada de pagamento. Estou enfrentando esse erro. Eu uso o servlet para o processo de back-end. Alguém pode dizer como corrigir esse problema?

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Primeiro, você precisa obter o certificado público do servidor ao qual está tentando se conectar. Isso pode ser feito de várias maneiras, como entrar em contato com o administrador do servidor e solicitá-lo, usando o openssl para baixá-lo ou, já que este parece ser um servidor HTTP, conectando-se a ele com qualquer navegador, visualizando as informações de segurança da página e salvando uma cópia do certificado. O Google deve ser capaz de dizer exatamente o que fazer para seu navegador específico.

Agora que você tem o certificado salvo em um arquivo, é necessário adicioná-lo ao truststore da sua JVM. Em $JAVA_HOME/jre/lib/security/ para JREs ou $JAVA_HOME/lib/security para JDKs, existe um arquivo chamado cacerts , que vem com Java e contém os certificados públicos das conhecidas Autoridades de Certificação. Para importar o novo certificado, execute keytool como um usuário com permissão para gravar em cacerts:

 keytool -import -file  -alias  -keystore  

Ele provavelmente pedirá uma senha. A senha padrão fornecida com java é o changeit . Quase ninguém muda isso. Depois de concluir essas etapas relativamente simples, você estará se comunicando com segurança e com a garantia de que está falando com o servidor certo e apenas com o servidor certo (contanto que eles não percam sua chave privada).

Agora resolvi esse problema dessa maneira,

 import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.OutputStream; // Create a trust manager that does not validate certificate chains like the default TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } } }; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { System.out.println(e); } 

É claro que esta solução só deve ser usada em cenários, onde não é possível instalar os certifcados necessários usando keytool por exemplo, testes locais com keytool temporários.

Sempre que tentamos nos conectar ao URL,

se o servidor no outro site estiver sendo executado no protocolo https e estiver exigindo que nos comuniquemos por meio das informações fornecidas no certificado, temos a seguinte opção:

1) solicite o certificado (baixe o certificado), importe este certificado em trustore. Usos padrão do trustore java podem ser encontrados em \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, em seguida, se tentarmos conectar-nos à conexão de URL, isso será aceito.

2) Em casos comerciais normais, podemos estar nos conectando a URLs internas nas organizações e sabemos que elas estão corretas. Nesses casos, você acredita que é o URL correto. Nesses casos, o código pode ser usado, o que não obrigará o armazenamento do certificado a se conectar a um determinado URL.

para o ponto n º 2, temos que seguir os passos abaixo:

1) escreva abaixo o método que define HostnameVerifier para HttpsURLConnection que retorna true para todos os casos, o que significa que estamos confiando na trustStore.

  // trusting all certificate public void doTrustToCertificates() throws Exception { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { return; } public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { return; } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) { System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'."); } return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(hv); } 

2) escreva abaixo o método, que chama doTrustToCertificates antes de tentar se conectar ao URL

  // connecting to URL public void connectToUrl(){ doTrustToCertificates();// URL url = new URL("https://www.example.com"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); System.out.println("ResponseCode ="+conn.getResponseCode()); } 

Essa chamada retornará o código de resposta = 200 significa que a conexão foi bem-sucedida.

Para mais detalhes e exemplos de exemplo, você pode consultar o URL .

Eu acredito que você está tentando se conectar a algo usando SSL, mas algo está fornecendo um certificado que não é verificado por autoridades de certificação raiz, como veriSign. Na essência, por padrão, conexões seguras só podem ser estabelecidas se a pessoa tentando se conectar sabe as chaves das contrapartes ou algum outro verndor como o verisign podem intervir e dizer que a chave pública que está sendo fornecida é realmente correta.

A ALL OS confia em um punhado de autoridades de certificação e emissores de certificados menores precisam ser certificados por um dos grandes certificadores que fazem uma cadeia de certificadores se você entender o que quero dizer …

De qualquer forma voltando ao ponto .. Eu tive um problema semelhante ao programar um applet java e um servidor java (Espero que algum dia eu vou escrever um post completo sobre como eu tenho toda a segurança para trabalhar :))

Em essência, o que eu tinha que fazer era extrair as chaves públicas do servidor e armazená-las em um keystore dentro do meu applet e quando me conectei ao servidor, usei esse armazenamento de chaves para criar um trust factory e esse trust factory para criar o ssl conexão. Existem procedimentos alterantes, como adicionar a chave ao host confiável da JVM e modificar o armazenamento confiável padrão na boot.

Eu fiz isso cerca de dois meses atrás e não tenho código-fonte em mim agora .. use o google e você deve ser capaz de resolver este problema. Se você não pode me enviar uma mensagem de volta e eu posso fornecer-lhe o código-fonte relevante para o projeto .. Não sei se isso resolve o seu problema desde que você não tenha fornecido o código que faz com que essas exceções. Além disso, eu estava trabalhando com applets pensei que não consigo ver por que ele não vai funcionar em Serverlets …

PS Eu não posso obter o código fonte antes do fim de semana desde SSH externo está desativado no meu escritório 🙁

SSLHandshakeException pode ser resolvido de 2 maneiras.

  1. Incorporando SSL

    • Obtenha o SSL (perguntando ao administrador do sistema de origem, também pode ser baixado pelo comando openssl ou qualquer navegador faz o download dos certificados)

    • Adicione o certificado ao truststore (cacerts) localizado em JRE / lib / security

    • forneça o local do armazenamento confiável nos argumentos da VM como “-Djavax.net.ssl.trustStore =”

  2. Ignorando o SSL

    Para esse número 2, visite minha outra resposta em outro site do stackoverflow: Como verificar a verificação SSL Ignore erros de certificado SSL com Java

Agora resolvi esse problema dessa maneira,

 import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.OutputStream; // Create a trust manager that does not validate certificate chains like the default TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { //No need to implement. } } }; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { System.out.println(e); }