Estou tentando conectar-me a uma caixa do IIS6 executando um certificado SSL de 256 bits godaddy e estou recebendo o erro:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Estive tentando determinar o que poderia estar causando isso, mas desenhando espaços em branco agora.
Aqui está como estou me conectando:
HttpsURLConnection conn;
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream());
fonte
Ao contrário da resposta aceita, você não precisa de um gerenciador de confiança personalizado, precisa corrigir a configuração do servidor!
Ocorreu o mesmo problema ao conectar-me a um servidor Apache com um certificado dynadot / alphassl incorretamente instalado. Estou me conectando usando HttpsUrlConnection (Java / Android), que estava lançando -
O problema real é uma configuração incorreta do servidor - teste-o com http://www.digicert.com/help/ ou similar, e ele fornecerá a solução:
"O certificado não é assinado por uma autoridade confiável (checando no repositório raiz do Mozilla). Se você comprou o certificado de uma autoridade confiável, provavelmente precisará instalar um ou mais certificados intermediários . Entre em contato com o seu provedor de certificados para obter ajuda sobre isso. plataforma de servidor ".
Você também pode verificar o certificado com o openssl:
openssl s_client -debug -connect www.thedomaintocheck.com:443
Você provavelmente verá:
Verify return code: 21 (unable to verify the first certificate)
e, anteriormente na saída:
A cadeia de certificados conterá apenas 1 elemento (seu certificado):
... mas deve referir as autoridades de assinatura em uma cadeia de volta a uma confiável do Android (Verisign, GlobalSign, etc):
As instruções (e os certificados intermediários) para configurar seu servidor geralmente são fornecidas pela autoridade que emitiu seu certificado, por exemplo: http://www.alphassl.com/support/install-root-certificate.html
Depois de instalar os certificados intermediários fornecidos pelo meu emissor de certificado, agora não tenho erros ao conectar usando HttpsUrlConnection.
fonte
Você pode confiar em um certificado específico em tempo de execução.
Basta fazer o download no servidor, colocar ativos e carregar assim usando ssl-utils-android :
No exemplo acima, usei,
OkHttpClient
masSSLContext
pode ser usado com qualquer cliente em Java.Se você tiver alguma dúvida não hesite em perguntar. Eu sou o autor desta pequena biblioteca.
fonte
Atualização com base na documentação mais recente do Android (março de 2017):
Quando você receber esse tipo de erro:
o problema pode ser um dos seguintes:
A solução é ensinar
HttpsURLConnection
a confiar em um conjunto específico de CAs. Quão? Verifique https://developer.android.com/training/articles/security-ssl.html#CommonProblemsPara outras pessoas que estão usando
AsyncHTTPClient
dacom.loopj.android:android-async-http
biblioteca, verifique o Setup AsyncHttpClient para usar HTTPS .fonte
Se você usar o retrofit, precisará personalizar seu OkHttpClient.
fonte
getUnsafeOkHttpClient()
no Kotlin: stackoverflow.com/a/60507560/2914140 .Respondendo a uma postagem muito antiga. Mas talvez isso ajude alguns novatos e, se não funcionar, acima.
Explicação: Eu sei que ninguém quer porcaria de explicação; sim a solução. Mas em um liner, você está tentando acessar um serviço da sua máquina local para uma máquina remota que não confia na sua máquina. Você solicita a necessidade de obter a confiança do servidor remoto.
Solução: A solução a seguir pressupõe que você tenha as seguintes condições atendidas
Passos:
Você precisa de um arquivo de extensão .keystore para inscrever seu aplicativo. Se você não sabe como criar o arquivo .keystore; em seguida, siga com a seção a seguir Criar arquivo .keystore ou pule para a próxima seção Assinar arquivo Apk
Criar arquivo .keystore
Abra o Android Studio. Clique no menu superior Compilar> Gerar APK assinado. Na janela seguinte, clique no novo ... Criar botão. Na nova janela, insira dados em todos os campos. Lembre-se dos dois campos de senha que eu recomendo devem ter a mesma senha; não use senha diferente; e também lembrar o caminho para salvar a top mais campo caminho de armazenamento de chaves . Depois de inserir todo o campo, clique no botão OK.
Assinar arquivo Apk
Agora você precisa criar um aplicativo assinado com o arquivo .keystore que você acabou de criar. Siga esses passos
Choose existing...
botãoKey store password
eKey password
campos. Digite também o aliasbuild.gradle
arquivos, você precisa selecionarBuild Types
eFlavors
.Build Types
escolharelease
no menu suspensoPois,
Flavors
no entanto, isso depende das suas configurações nobuild.gradle
arquivo. Escolhastaging
neste campo. Usei as seguintes configurações nobuild.gradle
, você pode usar o mesmo que o meu, mas certifique-se de alterar oapplicationId
nome do seu pacoteClique nas duas
Signature Versions
caixas de seleção inferiores e clique noFinish
botão.Quase lá:
Todo o trabalho é feito, agora o movimento da verdade. Para acessar o servidor de armazenamento temporário em backup por proxy, é necessário fazer algumas configurações em seus dispositivos Android de teste reais.
Configuração de proxy no dispositivo Android:
Modify network
Advanced options
se não conseguir ver oProxy Hostname
campoProxy Hostname
digite o IP do host ou o nome que você deseja conectar. Um servidor de temporariedade típico será nomeado comostg.api.mygoodcompany.com
9502
Save
botãoUma última parada:
Lembre-se de que geramos o arquivo apk assinado na seção Sign APK File . Agora é a hora de instalar esse arquivo APK.
adb install
name of the apk file
adb command not found
. Digite o caminho completo comoC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe
install
name of the apk file
Espero que o problema possa ser resolvido. Caso contrário, deixe-me um comentário.
Salam!
fonte
A mensagem de erro que eu recebia era semelhante, mas o motivo era que o certificado autoassinado havia expirado. Quando o cliente openssl foi tentado, ele me deu o motivo que foi esquecido quando eu estava verificando a caixa de diálogo de certificado do firefox.
Portanto, em geral, se o certificado estiver no keystore e seu "VÁLIDO", esse erro será disparado.
fonte
TrustManager
e usar um conjunto diferente de critérios. Mas pronto para usar, é com isso que você precisa trabalhar.Eu tive o mesmo problema ao conectar do cliente Android ao servidor Kurento. O servidor Kurento usa certificados jks, então tive que converter o pem nele. Como entrada para a conversão, usei o arquivo cert.pem e isso levou a esses erros. Mas se usar fullchain.pem em vez de cert.pem - tudo está bem.
fonte
Use https://www.ssllabs.com/ssltest/ para testar um domínio.
A solução de Shihab Uddin em Kotlin.
fonte
Eu tive o mesmo problema que descobri foi que o arquivo .crt do certificado que forneci estava ausente de um certificado intermediário. Então, perguntei a todos os arquivos .crt do administrador do servidor e os concatinei em ordem inversa.
Ex. 1. Root.crt 2. Inter.crt 3. myCrt.crt
no windows eu executei a cópia Inter.crt + Root.crt newCertificate.crt
(Aqui eu ignorei myCrt.crt)
Então eu forneci o arquivo newCertificate.crt no código via inputstream. Trabalho feito.
fonte
O erro da âncora de confiança pode ocorrer por vários motivos. Para mim, era simplesmente o que eu estava tentando acessar em
https://example.com/
vez dehttps://www.example.com/
.Portanto, convém verificar suas URLs antes de começar a criar seu próprio Trust Manager (como eu fiz).
fonte
Nos telefones Gingerbread, eu sempre recebo este erro:
Trust Anchor not found for Android SSL Connection
mesmo que eu configure para confiar no meu certificado.Aqui está o código que eu uso (no idioma Scala):
e aqui está o código de conexão:
Basicamente, eu configuro para confiar no meu certificado personalizado. Se isso falhar, desabilito a segurança. Essa não é a melhor opção, mas a única opção que conheço com telefones antigos e com bugs.
Esse código de amostra pode ser facilmente traduzido para Java.
fonte
No meu caso, isso estava acontecendo após a atualização para o Android 8.0. O certificado autoassinado em que o Android foi configurado para confiar estava usando o algoritmo de assinatura SHA1withRSA. A mudança para um novo certificado, usando o algoritmo de assinatura SHA256withRSA, corrigiu o problema.
fonte
Eu sei que você não precisa confiar em todos os certificados, mas, no meu caso, tive problemas com alguns ambientes de depuração em que tínhamos certificados autoassinados e que precisava de uma solução suja.
Tudo o que eu precisava fazer era mudar a inicialização do
sslContext
onde
trustAllCerts
foi criado assim:Espero que isso seja útil.
fonte
Hostname '192.168.0.16' was not verified
. Estou testando meu webapi por meio do meu depurador (IIS Express) localmente. Alguma idéia de como consertar isso? Obrigado :)Eu tive um problema semelhante e descartei completamente a estratégia de confiar em todas as fontes.
Compartilho aqui minha solução aplicada a um aplicativo implementado no Kotlin
Eu recomendaria primeiro usar o site a seguir para obter informações sobre o certificado e sua validade
Se ele não aparecer como "Emissores aceitos" no repositório de confiança padrão do Android , precisamos obter esse certificado e incorporá-lo ao aplicativo para criar um armazenamento confiável personalizado
A solução ideal no meu caso foi criar um Trust Manager de alto nível que combine o armazenamento confiável personalizado e o padrão do Android
Aqui, ele expõe o código de alto nível usado para configurar o OkHttpClient que ele usou com o Retrofit.
Dessa maneira, eu poderia me comunicar com o servidor com um certificado autoassinado e com outros servidores com um certificado emitido por uma entidade de certificação confiável
É isso, espero que possa ajudar alguém.
fonte
Sei que este é um artigo muito antigo, mas me deparei com este artigo ao tentar resolver meus problemas de âncora de confiança. Eu postei como corrigi-lo. Se você pré-instalou sua CA raiz, precisará adicionar uma configuração ao manifesto.
https://stackoverflow.com/a/60102517/114265
fonte
fonte
Eu também enfrentei o mesmo problema. Acabei de remover hhtps para http, como
final public static String ROOT_URL = "https://example.com";
parafinal public static String ROOT_URL = "http://example.com";
Finalmente, eu resolvi esse problema.
fonte