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.ValidatorException
e 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
Respostas:
"more info" > "security" > "show certificate" > "details" > "export.."
. Escolha o nome e escolha o tipo de arquivo example.cerAgora 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.
Em seguida, importe o
example.cer
arquivo 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
fonte
alias
nome do certificado na linha de comando também deve ser exclusivo.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/cacerts
instalações Java antiga e nova do jdk.Espero que isso economize a alguém horas de agravamento.
fonte
$JAVA_HOME/jre/lib
não,$JAVA_HOME/lib
passei um tempo perdendo esse detalhe.MINHA abordagem de interface do usuário:
Linha CMD:
keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
changeit
(pode ser alterado no Mac)fonte
keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
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.
InstallCert
e 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").jssecerts
arquivo dentro do diretório em que você executou o Programa (Se executado a partir do Eclipse, certifique-se de configurar o Work diretório emRun -> Configurations
).$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.
fonte
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
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:
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/cacerts
arquivo pelo novo do JRE mais recente instalado (faça uma cópia de backup primeiro), como @ jeremy-goodell sugere em sua resposta5. Adicione certificados ao seu keystore
Se nada acima resolver o seu problema, use
keytool
para salvar os certificados no keystore do Java: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:
Caso algo dê errado, isso ajudará você a remover o certificado da loja:
fonte
É usado para pular a validação do certificado.
Aviso Use apenas para fins de desenvolvimento, pois isso é inseguro!
fonte
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\cacerts
usar o comando já conhecido: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.
fonte
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 :
Resolução:
1. Faça o download do certificado do URL em questão:
2. Agora instale o armazenamento de chaves para corrigir o problema.
Comandos / saída de linha de comando de amostra:
fonte
Eu queria importar certificado para smtp.gmail.com
A única solução que funcionou para mim é 1. Digite o comando para visualizar este certificado
Copie e salve as linhas entre "----- COMEÇAR CERTIFICADO -----" e "----- TERMINAR CERTIFICADO -----" em um arquivo, gmail.cer
Corre
Inserir chageit de senha
Clique em Sim para importar o certificado
Reiniciar java
agora execute o comando e você está pronto para ir
fonte
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
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-bundle
arquivo é útil. Por exemplo, em uma configuração do Apache com mod_ssl, você usaria aSSLCertificateChainFile
configuraçã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.fonte
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) ####
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)por exemplo
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.
fonte
A adição
cacerts
não funcionou para mim. Depois de ativar o log com sinalizador-Djavax.net.debug=all
, passou a conhecer a leitura de javajssecacerts
.Importe para
jssecacerts
finalmente trabalhado.fonte
jssecacerts
se presente, caso contráriocacerts
.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.
fonte
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:
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 é:
No entanto, ao navegar para ele por meio de um navegador, ele é redirecionado para (observe o " .github " adicionado ):
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.
fonte
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
fonte
Resolvi esse problema no Windows Server 2016 com Java 8, importando o certificado da
pkcs12
loja para ocacerts
keystore.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
pkcs12
paracacerts
é 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).
fonte
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.
fonte
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.
fonte
metas:
Como fazer isso:
Meu arquivo de wrapper do Keystore:
Essa classe criará o keystore, se necessário, e poderá gerenciar certificados dentro dele. Agora classe para o contexto SSL:
Essa classe foi criada como singleton, porque apenas um contexto defaultSSL é permitido. Então, agora use:
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.
fonte
available()
é especificamente advertido em seu próprio Javadoc.É uma adição à resposta https://stackoverflow.com/a/36427118/1491414 . Obrigado @MagGGG
fonte
Corrigi isso usando o método abaixo
fonte
Quando você tiver um erro acima com o software atlassian ex. jira
você pode adicionar certs ao seu keystore confiável (altere missing_ca para o nome correto do certificado):
Se solicitado, coloque a senha
changeit
e confirmey
Depois disso, basta reiniciar o jira.
fonte
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:
deve ser substituído por este:
fonte
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=
&-jar
args, consegui chamar minha chamada de descanso com sucesso por https.fonte
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á.
fonte
Caso seu host esteja atrás de firewall / proxy , use o seguinte comando no cmd:
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.
fonte
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
fonte
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
Uma vez que os certificados são importados corretamente, isso deve ser feito. Não há necessidade de mexer com quaisquer materiais JDK.
fonte
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
Está feito.
fonte
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.
fonte