"Falha na construção do caminho PKIX" e "incapaz de encontrar o caminho de certificação válido para o destino solicitado"

423

Estou tentando obter tweets usando a biblioteca twitter4j para o meu projeto java. Na minha primeira execução, recebi um erro sobre certificado sun.security.validator.ValidatorExceptione sun.security.provider.certpath.SunCertPathBuilderException. Então eu adicionei o certificado do twitter por:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

Mas sem sucesso. Aqui está o procedimento para obter tweets:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("Total amount of tweets: " + result.getTweets().size());
        List<Status> tweets = result.getTweets();

        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to search tweets: " + te.getMessage());
    }

E aqui está o erro:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=d35baff5 or
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: 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
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
    ... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Dozent
fonte
6
Olá Verifique o URL abaixo. Estou certo de que isso irá ajudá-lo. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Você deve adicionar seu certificado ssl ao certificado de armazenamento confiável java (Caminho: jre / lib / security / cacerts).
sus007
Consulte esta resposta para obter a solução e confirme se está empacotando seu software como pacote fornecido. se sim, copie seu sistema de formulários de arquivo cacerts e substitua esse arquivo empacotado jre cacerts.
Positivecrux
tente este stackoverflow.com/a/9210661/4741746 pode ser esta é a sua resposta
Gosavi sushant
2
Acabei de usar esse código java e, para https, não se esqueça de especificar a porta como 443. Código Java em github.com/escline/InstallCert/blob/master/InstallCert.java Ele pegará seu arquivo CACERTS e incluirá todos esses o certificado atual para o URL que você fornece como entrada. No meu caso, codifiquei os valores para host = "mywebservice.uat.xyz.com"; porta = 443; frase-senha = "changeit" .toCharArray (); Em seguida, o programa cria um novo arquivo chamado "jssecacerts", que terá tudo. Renomeie para "cacerts" e use-o. Você estará pronto.
Reddymails

Respostas:

574
  1. Vá para o URL no seu navegador:
    • firefox - clique na cadeia de certificados HTTPS (o ícone de cadeado ao lado do endereço URL). Clique em "more info" > "security" > "show certificate" > "details" > "export..". Escolha o nome e escolha o tipo de arquivo example.cer
    • chrome - clique no ícone do site à esquerda para endereçar na barra de endereços, selecione "Certificado" -> "Detalhes" -> "Exportar" e salve no formato "Certificado único binário codificado com Der".
  2. Agora você tem um arquivo com o keystore e precisa adicioná-lo à sua JVM. Determine a localização dos arquivos cacerts, por exemplo. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Em seguida, importe o example.cerarquivo para cacerts na linha de comando:

keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

Você será solicitado a senha, que é o padrão changeit

Reinicie sua JVM / PC.

fonte: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

MagGGG
fonte
27
Eu tive que colocar o caminho entre aspas e também salvá-lo como Base64 em vez de DER
Theodore K.
3
wow..its funcionou como um mágico pela maneira em cromo basta clicar no ícone de cadeado na barra de endereços esquerda e clique em detalhes mais não há restart necessário
aswzen
8
Observe que as instruções devem ser repetidas para todos os certificados na cadeia. O aliasnome do certificado na linha de comando também deve ser exclusivo.
Lu55 12/09
5
Se sua casa for um JDK, certifique-se de especificar que o jre esteja dentro do arquivo: keytool -import -alias example -keystore "C: \ Arquivos de Programas \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble
12
Para quem receber um erro de "acesso negado", verifique se está executando o prompt de comando como administrador.
21718 Walker Walker Christie
81

Depois de muitas horas tentando criar arquivos cert para que minha instalação do Java 6 funcionasse com os novos certificados do twitter, finalmente encontrei uma solução incrivelmente simples, escondida em um comentário em um dos quadros de mensagens. Basta copiar o arquivo cacerts de uma instalação do Java 7 e substituir o da instalação do Java 6. Provavelmente, é melhor fazer um backup do arquivo cacerts primeiro, mas basta copiar o novo no BOOM! simplesmente funciona.

Observe que eu realmente copiei um arquivo cacerts do Windows em uma instalação do Linux e funcionou muito bem.

O arquivo está localizado nas jre/lib/security/cacertsinstalações Java antiga e nova do jdk.

Espero que isso economize a alguém horas de agravamento.

Jeremy Goodell
fonte
4
Estou tentando acessar um servidor ssl com um certificado autoassinado, tentei adicioná-lo usando o keytool, mas sem sorte, alguma sugestão?
21714 Oleg Belousov
1
Que bom que funcionou .. Mas você sabe qual foi a causa raiz. o que fez com que ele falhe com java 6 certs .. e como é que o java 7 certs resolveu o problema
Vishwanath gowda k
Foi o que fiz, embora eu tenha passado do icedtea 1.6 para o oracle 1.7. :)
nperson325681
Considere também esta solução: stackoverflow.com/questions/33439905/…
Piohen 12/16
10
Para quem gosta de mim às vezes sente falta do óbvio - tenha certeza de que está entrando - $JAVA_HOME/jre/libnão, $JAVA_HOME/libpassei um tempo perdendo esse detalhe.
21716 Ryan Heathcote
35

MINHA abordagem de interface do usuário:

  1. Faça o download do keystore explorer aqui
  2. Abra $ JAVA_HOME / jre / lib / security / cacerts
  3. digite PW: changeit (pode ser alterado no Mac)
  4. Importe seu arquivo .crt

Linha CMD:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. digite PW: changeit(pode ser alterado no Mac)
Mike Mitterer
fonte
1
No mac, com a linha CMD, deve usar o sudo para executar o comando. # sudo keytools -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi
1
No Windows, o comando que funciona:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla
de onde obter o arquivo cert? Não sei para qual URL ir. jetty.com ?
Kraftydevil 5/09/2017
Eu recebo meu certificado exportando-o do navegador da web, ação de contexto no cadeado
rtbf
28

Eu me deparei com esse problema, que levou muitas horas de pesquisa para corrigir, especialmente com certificados gerados automaticamente, que, diferentemente dos oficiais, são bastante complicados e o Java não gosta muito deles.

Verifique o seguinte link: Resolver problema com certificados em Java

Basicamente, você precisa adicionar o certificado do servidor aos certificados Java Home.

  1. Gere ou obtenha seu certificado e configure o Tomcat para usá-lo em Servers.xml
  2. Faça o download do código-fonte Java da classe InstallCerte execute-o enquanto o servidor estiver em execução, fornecendo os seguintes argumentosserver[:port] . Nenhuma senha é necessária, pois a senha original funciona para os certificados Java ("changeit").
  3. O Programa se conectará ao servidor e o Java lançará uma exceção, analisará o certificado fornecido pelo servidor e permitirá criar um jssecertsarquivo dentro do diretório em que você executou o Programa (Se executado a partir do Eclipse, certifique-se de configurar o Work diretório em Run -> Configurations).
  4. Copie manualmente esse arquivo para $JAVA_HOME/jre/lib/security

Após seguir estas etapas, as conexões com o certificado não gerarão mais exceções no Java.

O código-fonte a seguir é importante e desapareceu dos blogs Oracle (Sun), a única página que encontrei estava no link fornecido, portanto, estou anexando-o na resposta para qualquer referência.

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Originally from:
 * http://blogs.sun.com/andreas/resource/InstallCert.java
 * Use:
 * java InstallCert hostname
 * Example:
 *% java InstallCert ecc.fedora.redhat.com
 */

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Class used to add the server's certificate to the KeyStore
 * with your trusted certificates.
 */
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert [:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                    + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
                ("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            throw new UnsupportedOperationException();
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}
will824
fonte
2
Observe que o arquivo criado é jssecacerts!
precisa saber é
Tentei usar esta solução para Java 7 e 8. Enquanto executava no Java 7, obtive protocol_version ou handshake_failure para todos os URLs de repositório remoto com os quais tentei. SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
Sandeepan Nath
20

1. Verifique o certificado

Tente carregar o URL de destino no navegador e visualize o certificado do site (geralmente é acessível pelo ícone com o sinal de bloqueio. Está no lado esquerdo ou direito da barra de endereços do navegador), se ele expirou ou não foi confiável por outro motivo.

2. Instale as versões mais recentes do JRE e JDK

Novas versões geralmente vêm com o conjunto atualizado de certificados confiáveis.

Além disso, se possível, desinstale as versões antigas. Isso tornará explícitos os erros de configuração.

3. Verifique sua configuração:

  • Verifique para onde sua variável de ambiente JAVA_HOME aponta.
  • Verifique qual versão java você usa para executar o programa. No IntelliJ, verifique:
    • Arquivo -> Estrutura do projeto ... -> Configurações do projeto -> Projeto -> SDK do projeto:
    • Arquivo -> Estrutura do projeto ... -> Configurações da plataforma -> SDKs

4. Copie o keystore inteiro da nova versão do Java

Se você desenvolver no JDK diferente do mais recente disponível - tente substituir o %JAVA_HOME%/jre/lib/security/cacertsarquivo pelo novo do JRE mais recente instalado (faça uma cópia de backup primeiro), como @ jeremy-goodell sugere em sua resposta

5. Adicione certificados ao seu keystore

Se nada acima resolver o seu problema, use keytoolpara salvar os certificados no keystore do Java:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

O arquivo com o certificado pode ser obtido no navegador, como sugere @MagGGG em sua resposta .

Nota 1: pode ser necessário repetir isso para cada certificado da cadeia para o certificado do site. Comece pela raiz.

Nota 2: <alias_name>deve ser único entre as chaves da loja oukeytool mostrará um erro.

Para obter uma lista de todos os certificados na loja, você pode executar:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

Caso algo dê errado, isso ajudará você a remover o certificado da loja:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
Lu55
fonte
Com o quão bem elaborado isso é, deve ser a resposta aceita.
Egor Hans 23/03
13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

É usado para pular a validação do certificado.

Aviso Use apenas para fins de desenvolvimento, pois isso é inseguro!

gorums
fonte
4
Ele é usado para saltar a validação do certificado
gorums
2
@gorums Como configurá-lo no Eclipse?
Malajisi
6
NÃO faça isso, a menos que você queira correr o risco de executar códigos maliciosos arbitrários em sua máquina. Voto negativo, pois corre o risco de comprometer qualquer máquina que o execute.
187 Bryan #
1
Só porque 'funciona' não significa que é seguro, você está colocando em risco todo mundo que segue este conselho. Tenho meu voto negativo
Paradoxis
1
@AceKing O ponto é que é não confiável de código se você não validar o certificado. Dito isto, acho que ainda é uma resposta útil. As pessoas que fazem isso só precisam entender os riscos.
Michael Mior
12

Eu tive uma situação um pouco diferente, quando o JDK e o JRE 1.8.0_112 estavam presentes no meu sistema.

Importei os novos certificados de autoridade de certificação para [JDK_FOLDER]\jre\lib\security\cacertsusar o comando já conhecido:

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

Ainda assim, eu continuava recebendo o mesmo caminho de construção do PKIX falhou erro de .

Adicionei informações de depuração à java CLI, usando java -Djavax.net.debug=all ... > debug.log. No arquivo debug.log, a linha que começa com trustStore é: realmente apontada para o armazenamento de cacerts encontrado em[JRE_FOLDER]\lib\security\cacerts .

No meu caso, a solução foi copiar o arquivo cacerts usado pelo JDK (que tinha as novas CAs adicionadas) sobre o usado pelo JRE e que resolveu o problema.

MF
fonte
Importei diretamente certs que eu precisava para o JRE / lib / security / cacerts usando o keytool, mas isso não mudou nada para mim :( ainda recebendo o mesmo erro, eu também os adicionei via IDE ou mesmo no caminho de classe e adicionei um Bean ao especificar o local de armazenamento de chaves !! É uma loucura AF!
Alex
8

Histórico da questão:

Eu estava recebendo o seguinte erro ao tentar executar a instalação limpa do mvn no meu projeto e através da opção de limpeza e compilação do Netbeans IDE. Esse problema ocorre porque o certificado não está disponível quando fazemos o download através do IDE do NET beans / através do prompt de comando, mas é possível fazer o download dos arquivos através do navegador.

Erro :

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  

Resolução:

1. Faça o download do certificado do URL em questão:

  • Inicie o IE "run as adminstrator" (caso contrário, não conseguiremos fazer o download do certificado)
  • Digite o URL em IE-> https: // url / local-repo (no meu caso, esse URL tinha um certificado não confiável insira a descrição da imagem aqui).
  • Faça o download do certificado clicando em Erro de certificado -> exibir certificado
  • Selecione a guia Detalhes -> copiar para arquivo -> próximo -> selecione "X.509 binário codificado por DER (.CER)
  • salve o certificado em algum local, por exemplo: c: /user/sheldon/desktop/product.cer
  • Parabéns! você baixou com êxito o certificado do site

2. Agora instale o armazenamento de chaves para corrigir o problema.

  • Execute o comando keytool para anexar o keystore baixado no arquivo de certificado existente.
  • Comando: Abaixo do comando na pasta bin do jdk (JAVA_HOME) .

C: \ Arquivos de programas \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file "C: /user/sheldon/desktop/product.cer" - alias product -keystore "C: / Arquivos de programas / Java / jdk1.8.0_141 / jre / lib / security / cacerts ".

  • Você será solicitado a digitar a senha. Digite a senha do keystore: digite "changeit" novamente para "Confiar neste certificado? [Não]:", digite "yes"

Comandos / saída de linha de comando de amostra:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Contgrats! agora você deve ter se livrado do erro "Falha na criação do caminho do PKIX: sun.security.provider.certpath.SunCertPathBuilderException" no seu Netbeans IDE.
Barani r
fonte
Oi eu segui todos os passos, mas sem sorte :(
ManishNegi
você tem algum outro certificado no caminho que não seja cacerts? se você tem algum outro, tentar adicioná-lo a esse certificado
Barani r
Graças r @Barani, Foi meu erro eu estava executando o comando do JRE e JDK usando no meu eclipse
ManishNegi
Não foi possível baixar o certificado, mas depois "executar como administrador" funcionou bem.
Outro codificador
8

Eu queria importar certificado para smtp.gmail.com

A única solução que funcionou para mim é 1. Digite o comando para visualizar este certificado

D: \ openssl \ bin \ openssl.exe s_client -connect smtp.gmail.com:465

  1. Copie e salve as linhas entre "----- COMEÇAR CERTIFICADO -----" e "----- TERMINAR CERTIFICADO -----" em um arquivo, gmail.cer

  2. Corre

    keytool -import -alias smtp.gmail.com -keystore "% JAVA_HOME% / jre / lib / security / cacerts" -arquivo C: \ Users \ Admin \ Desktop \ gmail.cer

  3. Inserir chageit de senha

  4. Clique em Sim para importar o certificado

  5. Reiniciar java

agora execute o comando e você está pronto para ir

Sneha Shejwal
fonte
Obrigado cara! Isso salvou o meu dia. Esta foi a única solução apropriada no meu caso.
Andrew Gans
Salvou o meu dia também. Obrigado.
Kris
6

Esta não é uma resposta específica do Twitter, mas é a pergunta que surge quando você procura esse erro. Se o seu sistema está recebendo esse erro ao se conectar a um site que parece ter um certificado válido quando visualizado em um navegador da Web , isso provavelmente significa que o site possui uma cadeia de certificados incompleta .

Para um breve resumo do problema: As autoridades de certificação não usam o certificado raiz para assinar qualquer certificado antigo. Em vez disso, eles (geralmente) assinam certificados intermediários que também têm o sinalizador de Autoridade de Certificação definido (ou seja, têm permissão para assinar certificados). Então, quando você compra um certificado de uma CA, eles assinam seu CSR com um desses certificados intermediários.

Seu armazenamento confiável Java provavelmente só possui o certificado raiz, não os intermediários.

Um site mal configurado pode retornar apenas o certificado assinado. Problema: foi assinado com um certificado intermediário que não está em seu armazenamento confiável. Os navegadores resolverão esse problema baixando ou usando um certificado intermediário em cache; isso maximiza a compatibilidade do site. Java e ferramentas como OpenSSL, no entanto, não. E isso causará o erro na pergunta.

Você pode verificar essa suspeita usando o Teste SSL da Qualys . Se você executar isso em um site e ele disser

A cadeia de certificados deste servidor está incompleta.

então isso confirma. Você também pode ver isso observando os caminhos da certificação e vendo o texto Download extra .

Como consertar: o administrador do servidor precisa configurar o servidor da web para retornar também os certificados intermediários. Para o Comodo, por exemplo, é aqui que o .ca-bundlearquivo é útil. Por exemplo, em uma configuração do Apache com mod_ssl, você usaria a SSLCertificateChainFileconfiguração. Para o nginx, você precisa concatenar os certificados intermediários e o certificado assinado e usá-lo na configuração do certificado SSL. Você pode encontrar mais informações pesquisando "cadeia de certificados incompleta" online.

Reid
fonte
Você é brilhante. Obrigado! Eu tive um problema com a nova buildout do meu servidor Java porque esqueci de remover o # na frente do SSLCertificateChainFile !!! Muito bem explicado.
KisnardOnline 15/03
6

A razão pela qual obtivemos o erro acima é que o JDK inclui muitos certificados confiáveis ​​da Autoridade de Certificação (CA) em um arquivo chamado 'cacerts', mas esse arquivo não tem idéia do nosso certificado autoassinado. Em outras palavras, o arquivo cacerts não possui nosso certificado autoassinado importado e, portanto, não o trata como uma entidade confiável e, portanto, gera o erro acima.

Como corrigir o erro acima

Para corrigir o erro acima, tudo o que precisamos é importar o certificado autoassinado para o arquivo cacerts.

Primeiro, localize o arquivo cacerts. Precisamos descobrir a localização do JDK. Se você estiver executando seu aplicativo através de um dos IDE, como Eclipse ou IntelliJ Idea, vá para as configurações do projeto e descubra qual é o local do JDK. Por exemplo, em um Mac OS, o local típico do arquivo cacerts seria neste local / Library / Java / JavaVirtualMachines / {{JDK_version}} / Conteúdo / Home / jre / lib / security na máquina de uma janela, estaria em {{Installation_directory} } / {{JDK_version}} / jre / lib / security

Depois de localizar o arquivo cacerts, agora precisamos importar nosso certificado autoassinado para esse arquivo cacerts. Verifique o último artigo, se você não souber como gerar o certificado autoassinado corretamente.

Se você não possui um arquivo de certificado (.crt) e apenas possui um arquivo .jks, pode gerar um arquivo .crt usando o comando abaixo. Caso você já tenha um arquivo .crt / .pem, poderá ignorar o comando abaixo

## Para gerar o certificado do keystore (arquivo .jks) ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

A etapa acima irá gerar um arquivo chamado selfsigned.crt. Agora, importe o certificado para cacerts

Agora adicione o certificado ao JRE / lib / security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

por exemplo

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Isso é tudo, reinicie seu aplicativo e ele deve funcionar bem. Se ainda assim não funcionar e obter uma exceção de handshake SSL. Provavelmente significa que você está usando um domínio diferente do registrado no certificado.

O link com explicação detalhada e resolução passo a passo está aqui.

Abhishek Galoda
fonte
4

A adição cacertsnão funcionou para mim. Depois de ativar o log com sinalizador -Djavax.net.debug=all, passou a conhecer a leitura de java jssecacerts.

Importe para jssecacertsfinalmente trabalhado.

alk453
fonte
2
A explicação que falta aqui é que o Java usará jssecacertsse presente, caso contrário cacerts.
Marquês de Lorne
3

Esta é uma solução, mas na forma da minha história com este problema:

Eu estava quase morto tentando todas as soluções dadas acima (por 3 dias) e nada funcionou para mim.

Eu perdi toda a esperança.

Entrei em contato com minha equipe de segurança sobre isso porque estava atrás de um proxy e eles disseram que haviam atualizado recentemente sua política de segurança.

Eu os repreendi mal por não informar os Desenvolvedores.

Mais tarde, eles emitiram um novo arquivo "cacerts" que contém todos os certificados.

Eu removi o arquivo cacerts que está presente dentro de% JAVA_HOME% / jre / lib / security e resolveu o meu problema.

Portanto, se você estiver enfrentando esse problema, talvez seja da sua equipe de rede também.

Vikash Kumar
fonte
2

Me deparei com essa pergunta ao tentar instalar o plug-in Cucumber-Eclipse no Eclipse por meio do site de atualização. Eu recebi o mesmo erro SunCertPathBuilderException:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Embora algumas das outras respostas sejam apropriadas e úteis para a situação dada a essa pergunta, elas foram, no entanto, inúteis e enganosas para o meu problema.

No meu caso, o problema era que o URL fornecido para o site de atualização é:

https://cucumber.io/cucumber-eclipse/update-site

No entanto, ao navegar para ele por meio de um navegador, ele é redirecionado para (observe o " .github " adicionado ):

http://cucumber.github.io/cucumber-eclipse/update-site/

Portanto, a resolução é simplesmente usar a versão redirecionada da URL do site de atualização ao adicionar o site de atualização no eclipse.

royfripple
fonte
3
Tem certeza de que está respondendo à pergunta certa? Não há nenhuma menção de pepino na pergunta original ...
Feito Data Solutions
Eu sinto que sou. Eu recebi o mesmo erro SunCertPathBuilderException e ao mesmo tempo à procura de uma resolução, achou esta questão, bem como um presente . No entanto, nenhum deles tinha solução adequada para a minha situação. Eu não estava tentando responder à pergunta específica de como adicionar o site de plug-in Cucumber-Eclipse ao eclipse. Eu queria fornecer um contexto para o problema que enfrentava (redirecionamento de URL) e explicar como ele foi resolvido.
Royfripple #
Atualizei minha resposta para deixar claro que recebi o mesmo erro, observando que o problema e a solução subjacentes eram diferentes. Acho que isso é válido, pois outras pessoas podem encontrar essa pergunta ao pesquisar o mesmo erro. Por favor, considere alterar seu voto se achar que isso faz sentido.
Royfripple
Obrigado. Torna as coisas muito mais clara, inverteu o meu downvote
Feito Data Solutions
De nada! E obrigado por reservar um tempo para analisá-lo novamente.
Royfripple
2

Eu estava enfrentando o mesmo problema e resolvido usando as etapas simples abaixo:

1) Baixe o InstallCert.java do google

2) Compile-o usando o javac InstallCert.java

3) Execute o InstallCert.java usando o java InstallCert.java , com o nome do host e a porta https, e pressione “1” ao solicitar entrada. Ele adicionará o "localhost" como um keystore confiável e gerará um arquivo chamado "jssecacerts" como abaixo:

java InstallCert localhost: 443

4) copie os jssecacerts para a pasta $ JAVA_HOME / jre / lib / security

A principal fonte para resolver o problema aqui é:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

Ankur jain
fonte
1

Resolvi esse problema no Windows Server 2016 com Java 8, importando o certificado da pkcs12loja para o cacertskeystore.

Caminho para a loja pkcs12:
C:\Apps\pkcs12.pfx

Caminho para cacerts Java:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Caminho para ferramenta-chave:
C:\Program Files\Java\jre1.8.0_151\bin

depois de possuir a pasta com ferramenta-chave no prompt de comando (como administrador), o comando para importar o certificado de pkcs12para cacertsé o seguinte:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Você será solicitado a:
1. inserir a senha do keystore de destino (
senha do cacerts, o padrão é "changeit") 2. insira a senha do keystore de origem (senha do pkcs12)


Para que as mudanças entrem em vigor, reinicie a máquina do servidor (ou apenas reinicie a JVM).

ognjenkl
fonte
1
Eu usei essa abordagem em um Mac e funcionou. É claro que meu certificado foi autoassinado e gerado para importar o arquivo .pfx que eu havia gerado no meu servidor windows adfs. Usando o Java 10 para meu aplicativo Obrigado
Shashikant Soni 16/04
0

Aqui normalmente, esse tipo de exceção ocorre quando há incompatibilidade no CAMINHO do certificado confiável. Verifique a configuração ou o caminho em que este certificado do servidor é necessário para a comunicação segura.

cetana
fonte
Você pode me dizer a configuração exata em que eu posso instalar o certificado. Estou tendo problemas com isso, instalei o certificado com relação ao problema usando o keytool , isso funciona por cerca de 20 a 30 minutos e, em seguida, o servidor emite o mesmo erro novamente. Por favor me ajude. Estou preso nesta edição por 2 dias.
Deepak Gangore
Eu acho que o certificado muda a cada 20-30 minutos
Vishwanath gowda k
Estou enfrentando um problema semelhante, mas o problema é: MEU java escolhe o local padrão para $ JAVA_HOME / lib / security / cacerts de aplicativos Java, embora eu tenha fornecido -Djavax.net.ssl.trustStore = / myapp / app.jks Alguém pode me ajudar sobre isso: stackoverflow.com/questions/33821785/…
Laxman G
0

Para mim, o erro de certificado apareceu porque eu tinha um violinista sendo executado em segundo plano e isso atrapalha o certificado. Ele atua como um proxy tão próximo que e reinicia o eclipse.

Atihska
fonte
mesmo prov acontecendo em eclipse, mesmo depois de fechar todas as aplicações
arvindwill
0

metas:

  1. use conexões https
  2. verificar cadeias SSL
  3. não lide com cacerts
  4. adicionar certificado em tempo de execução
  5. não perca certificados de cacerts

Como fazer isso:

  1. definir próprio keystore
  2. colocar certificado no keystore
  3. redefinir o contexto padrão SSL com nossa classe personalizada
  4. ???
  5. lucro

Meu arquivo de wrapper do Keystore:

public class CertificateManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private String keyStoreLocation;
    private String keyStorePassword;
    private X509TrustManager myTrustManager;
    private static KeyStore myTrustStore;

    public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
        this.keyStoreLocation = keyStoreLocation;
        this.keyStorePassword = keyStorePassword;
        myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
    }

    public void addCustomCertificate(String certFileName, String certificateAlias)
            throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);
        Certificate certificate = myTrustStore.getCertificate(certificateAlias);
        if (certificate == null) {
            logger.info("Certificate not exists");
            addCertificate(certFileName, certificateAlias);
        } else {
            logger.info("Certificate exists");
        }
        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(myTrustStore);
        for (TrustManager tm : tmf.getTrustManagers()) {
            if (tm instanceof X509TrustManager) {
                setMytrustManager((X509TrustManager) tm);
                logger.info("Trust manager found");
                break;
            }
        }
    }

    private InputStream fullStream(String fname) throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream resource = classLoader.getResourceAsStream(fname);
        try {
            if (resource != null) {
                DataInputStream dis = new DataInputStream(resource);
                byte[] bytes = new byte[dis.available()];
                dis.readFully(bytes);
                return new ByteArrayInputStream(bytes);
            } else {
                logger.info("resource not found");
            }
        } catch (Exception e) {
            logger.error("exception in certificate fetching as resource", e);
        }
        return null;
    }

    public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
        try {
            InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(in, pass.toCharArray());
            logger.info("Keystore was created from resource file");
            return keyStore;
        } catch (Exception e) {
            logger.info("Fail to create keystore from resource file");
        }

        File file = new File(keystore);
        KeyStore keyStore = KeyStore.getInstance("JKS");
        if (file.exists()) {
            keyStore.load(new FileInputStream(file), pass.toCharArray());
            logger.info("Default keystore loaded");
        } else {
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream(file), pass.toCharArray());
            logger.info("New keystore created");
        }
        return keyStore;
    }

    private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
            IOException, KeyStoreException, NoSuchAlgorithmException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream certStream = fullStream(certFileName);
        Certificate certs = cf.generateCertificate(certStream);
        myTrustStore.setCertificateEntry(certificateAlias, certs);
        FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
        myTrustStore.store(out, getKeyStorePassword().toCharArray());
        out.close();
        logger.info("Certificate pushed");
    }

    public String getKeyStoreLocation() {
        return keyStoreLocation;
    }

    public String getKeyStorePassword() {
        return keyStorePassword;
    }
    public X509TrustManager getMytrustManager() {
        return myTrustManager;
    }
    public void setMytrustManager(X509TrustManager myTrustManager) {
        this.myTrustManager = myTrustManager;
    }
}

Essa classe criará o keystore, se necessário, e poderá gerenciar certificados dentro dele. Agora classe para o contexto SSL:

public class CustomTrustManager implements X509TrustManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private static SSLSocketFactory socketFactory;
    private static CustomTrustManager instance = new CustomTrustManager();
    private static List<CertificateManager> register = new ArrayList<>();

    public static CustomTrustManager getInstance() {
        return instance;
    }

    private X509TrustManager defaultTm;

    public void register(CertificateManager certificateManager) {
        for(CertificateManager manager : register) {
            if(manager == certificateManager) {
                logger.info("Certificate manager already registered");
                return;
            }
        }
        register.add(certificateManager);
        logger.info("New Certificate manager registered");
    }

    private CustomTrustManager() {
        try {
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);

            tmf.init((KeyStore) null);
            boolean found = false;
            for (TrustManager tm : tmf.getTrustManagers()) {
                if (tm instanceof X509TrustManager) {
                    defaultTm = (X509TrustManager) tm;
                    found = true;
                    break;
                }
            }
            if(found) {
                logger.info("Default trust manager found");
            } else {
                logger.warn("Default trust manager was not found");
            }

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{this}, null);
            SSLContext.setDefault(sslContext);
            socketFactory = sslContext.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);


            logger.info("Custom trust manager was set");
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            logger.warn("Custom trust manager can't be set");
            e.printStackTrace();
        }
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        List<X509Certificate> out = new ArrayList<>();
        if (defaultTm != null) {
            out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
        }
        int defaultCount = out.size();
        logger.info("Default trust manager contain " + defaultCount + " certficates");
        for(CertificateManager manager : register) {
            X509TrustManager customTrustManager = manager.getMytrustManager();
            X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
            out.addAll(Arrays.asList(issuers));
        }
        logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
        X509Certificate[] arrayOut = new X509Certificate[out.size()];
        return out.toArray(arrayOut);
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        for(CertificateManager certificateManager : register) {
            X509TrustManager customTrustManager = certificateManager.getMytrustManager();
            try {
                customTrustManager.checkServerTrusted(chain, authType);
                logger.info("Certificate chain (server) was aproved by custom trust manager");
                return;
            } catch (Exception e) {
            }
        }
        if (defaultTm != null) {
            defaultTm.checkServerTrusted(chain, authType);
            logger.info("Certificate chain (server) was aproved by default trust manager");
        } else {
            logger.info("Certificate chain (server) was rejected");
            throw new CertificateException("Can't check server trusted certificate.");
        }
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        try {
            if (defaultTm != null) {
                defaultTm.checkClientTrusted(chain, authType);
                logger.info("Certificate chain (client) was aproved by default trust manager");
            } else {
                throw new NullPointerException();
            }
        } catch (Exception e) {
            for(CertificateManager certificateManager : register) {
                X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                try {
                    customTrustManager.checkClientTrusted(chain, authType);
                    logger.info("Certificate chain (client) was aproved by custom trust manager");
                    return;
                } catch (Exception e1) {
                }
            }
            logger.info("Certificate chain (client) was rejected");
            throw new CertificateException("Can't check client trusted certificate.");
        }
    }

    public SSLSocketFactory getSocketFactory() {
        return socketFactory;
    }
}

Essa classe foi criada como singleton, porque apenas um contexto defaultSSL é permitido. Então, agora use:

            CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
            String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
            try {
                certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
            } catch (Exception e) {
                log.error("Can't add custom certificate");
                e.printStackTrace();
            }
            CustomTrustManager.getInstance().register(certificateManager);

Possivelmente, ele não funcionará com essas configurações, porque eu mantenho o arquivo de certificado dentro da pasta de recursos, portanto meu caminho não é absoluto. Mas, geralmente, funciona perfeitamente.

degr
fonte
1
Esse duplo uso indevido available()é especificamente advertido em seu próprio Javadoc.
Marquês de Lorne
0

É uma adição à resposta https://stackoverflow.com/a/36427118/1491414 . Obrigado @MagGGG

  • Verifique se você tem permissão de administrador
  • Por favor, use aspas duplas para o caminho do keystore (-keystore C: \ Arquivos de Programas (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts ") porque no sistema operacional Windows o local de instalação padrão será Arquivos de Programa e você obterá um erro devido ao espaço entre os arquivos de programa.
Ganesa Vijayakumar
fonte
0

Corrigi isso usando o método abaixo

  1. Copiar URL que está com problema de conexão
  2. Vá para Android Studio-> Configurações-> Configurações de HTTP
  3. Em "Conexão de teste", cole esse URL e pressione ok
  4. Ao clicar em Ok, o Android Studio solicitará a importação do certificado desse URL, importá-lo
  5. É isso aí. Não há mais nada a ser feito e meu problema desapareceu. Não há necessidade de reiniciar o estúdio também.
AndroDev
fonte
0

Quando você tiver um erro acima com o software atlassian ex. jira

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user '[email protected]' via protocol 'imaps, caused by: 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

você pode adicionar certs ao seu keystore confiável (altere missing_ca para o nome correto do certificado):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

Se solicitado, coloque a senha changeite confirmey

Depois disso, basta reiniciar o jira.

Karol Murawski
fonte
0

Se o URL do seu repositório também funcionar com HTTP e a segurança não for uma preocupação, você pode ir para settings.xml (geralmente, mas nem sempre, localizado em %USERPROFILE%/.m2) e substituir HTTPS por HTTP para <repository>e<pluginRepository> URLs.

Por exemplo, isto:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

deve ser substituído por este:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>
ROMANIA_engineer
fonte
0

Eu estava usando minha própria loja de confiança em vez da JRE, passando arg -Djavax.net.ssl.trustStore=

Eu estava recebendo esse erro, independentemente de certs no armazenamento confiável. O problema para mim foi a ordenação das propriedades passadas na linha arg. Quando eu coloquei -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= before -Dspring.config.location= & -jarargs, consegui chamar minha chamada de descanso com sucesso por https.

jasonoriordan
fonte
0

Se você estiver usando o CloudFoundry e tiver problemas de certificado, precisará enviar novamente o jar com o serviço de armazenamento de chaves com o certificado. Simplesmente desvincular, vincular e reiniciar não funcionará.

Smart Coder
fonte
0

Caso seu host esteja atrás de firewall / proxy , use o seguinte comando no cmd:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

Substitua <proxy_hostname>e <proxy_port>pelo servidor proxy HTTP configurado. Substitua <remote_host_name:remote_ssl_port>por um host remoto (basicamente url) e porta com problema de certificação.

Pegue o último conteúdo do certificado impresso e copie-o (também copie o certificado de início e término). Cole-o no arquivo de texto e dê a extensão .crt . Agora importe esse certificado para cacerts usando o comando java keytool e ele deve funcionar.

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
Aniket Warey
fonte
0

Tente copiar o java cacerts:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts

Lucas Mendes Mota Da Fonseca
fonte
0

Se você estiver vendo esse problema em um contêiner linux quando o aplicativo java estiver tentando se comunicar com outro aplicativo / site, é porque o certificado foi importado incorretamente no balanceador de carga. Há uma sequência de etapas a serem seguidas para a importação de certificados e, se não for feito corretamente, você verá problemas como

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

Uma vez que os certificados são importados corretamente, isso deve ser feito. Não há necessidade de mexer com quaisquer materiais JDK.

vsingh
fonte
0

Eu resolvi isso para IntelliJ IDEA I enfrentando este problema Althouh, eu mudar um monte de lugar para resolver problem.I encontrou uma solução para mim .right clique seu projeto, você vai ver Maven , depois que a imprensa Gerar Fontes e atualizar pastas e reimportar insira a descrição da imagem aqui

Está feito.

java.nazif
fonte
0

Eu estava enfrentando o mesmo problema, estava usando o 8.1.0-3, mas depois usei o 9.2.1-0 e o problema foi corrigido sem nenhuma etapa manual. O certificado autoassinado funcionou bem.

Darshil Shah
fonte