studio not found for certpathvalidatorexception certification cert bearer java android ssl retrofit

java - not - retrofit ssl



javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: No se encuentra el ancla de confianza para la ruta de certificación (6)

El SSL no está configurado correctamente. Esos errores de trustAnchor generalmente significan que no se puede encontrar el almacén de confianza. Verifique su configuración y asegúrese de que realmente apunte al almacén de confianza y de que esté en su lugar.

Asegúrese de que tiene un conjunto de propiedades del sistema -Djavax.net.ssl.trustStore y luego verifique que la ruta realmente lleva al almacén de confianza.

También puede habilitar la depuración de SSL configurando esta propiedad del sistema -Djavax.net.debug=all . Dentro de la salida de depuración, notará que indica que no puede encontrar el almacén de confianza.

Estoy usando Retrofit para acceder a mi API REST. Sin embargo, cuando pongo mi API detrás de ssl y accedo a ella por http://myhost/myapi , http://myhost/myapi este error:

¿Debo hacer algo adicional ahora que mi API está detrás de SSL?

Así es como me conecto:

private final String API = "https://myhost/myapi"; private final RestAdapter REST_ADAPTER = new RestAdapter.Builder() .setServer(API) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); 01-10 09:49:55.621 2076-2100/com.myapp.mobile D/Retrofit﹕ javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:401) at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134) at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90) at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287) at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222) at $Proxy12.signin(Native Method) at com.myapp.loginactivity$3.doInBackground(LoginActivity.java:143) at com.myapp.loginactivity$3.doInBackground(LoginActivity.java:136) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask.run(FutureTask.java:234) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at java.lang.Thread.run(Thread.java:841) Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:282) at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202) at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:595) at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method) at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:398)             at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)             at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)             at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)             at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)             at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)             at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)             at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)             at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)             at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90)             at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48)             at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287)             at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222)             at $Proxy12.signin(Native Method)             at com.myapp.LoginActivity$3.doInBackground(LoginActivity.java:143)             at com.myapp.LoginActivity$3.doInBackground(LoginActivity.java:136)             at android.os.AsyncTask$2.call(AsyncTask.java:287)             at java.util.concurrent.FutureTask.run(FutureTask.java:234)             at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)             at java.lang.Thread.run(Thread.java:841)



Hay 4 maneras que conozco:

  • Importa el certificado a tu aplicación y úsalo para la conexión.
  • deshabilitar la verificación de certificados
  • agregue su certificado a los certificados de sistema de confianza en Android
  • Compra un certificado verificado que sea aceptado por Android

Supongo que no quiere pagar por esto, así que creo que la solución más elegante es la primera, lo que se puede lograr de esta manera:

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html


Hola mismo problema que he resuelto puedes probar esto

java.security.cert.CertPathValidatorException: No se ha encontrado el ancla de confianza para la ruta de certificación.NETWORK

// SET SSL public static OkClient setSSLFactoryForClient(OkHttpClient client) { try { // Create a trust manager that does not validate certificate chains final TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } } }; // Install the all-trusting trust manager final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); client.setSslSocketFactory(sslSocketFactory); client.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } catch (Exception e) { throw new RuntimeException(e); } return new OkClient(client); }


La razón por la que esto ocurre es que JVM / Dalvik no confía en los certificados de CA en el sistema o en los almacenes de certificados de usuario.

Para solucionar este problema con la actualización, si se usa okhttp, con otro cliente es muy similar.
Tienes que hacer

UNA). Crear un almacén de certificados con clave pública de CA. Para hacer esto necesita iniciar el siguiente script para * nix. Necesita la instalación de openssl en su máquina, y descargue desde https://www.bouncycastle.org/ el jar bcprov-jdk16-1.46.jar. Descarga esta versión, no la otra, la versión 1.5x no es compatible con Android 4.0.4.

#!/bin/bash if [ -z $1 ]; then echo "Usage: cert2Android<CA cert PEM file>" exit 1 fi CACERT=$1 BCJAR=bcprov-jdk16-1.46.jar TRUSTSTORE=mytruststore.bks ALIAS=`openssl x509 -inform PEM -subject_hash -noout -in $CACERT` if [ -f $TRUSTSTORE ]; then rm $TRUSTSTORE || exit 1 fi echo "Adding certificate to $TRUSTSTORE..." keytool -import -v -trustcacerts -alias $ALIAS / -file $CACERT / -keystore $TRUSTSTORE -storetype BKS / -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider / -providerpath $BCJAR / -storepass secret echo "" echo "Added ''$CACERT'' with alias ''$ALIAS'' to $TRUSTSTORE..."

SEGUNDO). Copie el archivo truststore mytruststore.bks en res / raw de su proyecto

DO). Configuración de SSLContext de la conexión:

............. okHttpClient = new OkHttpClient(); try { KeyStore ksTrust = KeyStore.getInstance("BKS"); InputStream instream = context.getResources().openRawResource(R.raw.mytruststore); ksTrust.load(instream, "secret".toCharArray()); // TrustManager decides which certificate authorities to use. TrustManagerFactory tmf = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ksTrust); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); okHttpClient.setSslSocketFactory(sslContext.getSocketFactory()); } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | KeyManagementException e) { e.printStackTrace(); } .................


Yo uso esta clase y no tengo ningún problema.

public class WCFs { // https://192.168.30.8/myservice.svc?wsdl private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "192.168.30.8"; private static final String SERVICE = "/myservice.svc?wsdl"; private static String SOAP_ACTION = "http://tempuri.org/iWCFserviceMe/"; public static Thread myMethod(Runnable rp) { String METHOD_NAME = "myMethod"; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("Message", "Https WCF Running..."); return _call(rp,METHOD_NAME, request); } protected static HandlerThread _call(final RunProcess rp,final String METHOD_NAME, SoapObject soapReq) { final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); int TimeOut = 5*1000; envelope.dotNet = true; envelope.bodyOut = soapReq; envelope.setOutputSoapObject(soapReq); final HttpsTransportSE httpTransport_net = new HttpsTransportSE(URL, 443, SERVICE, TimeOut); try { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() // use this section if crt file is handmake { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); KeyStore k = getFromRaw(R.raw.key, "PKCS12", "password"); ((HttpsServiceConnectionSE) httpTransport_net.getServiceConnection()).setSSLSocketFactory(getSSLSocketFactory(k, "SSL")); } catch(Exception e){} HandlerThread thread = new HandlerThread("wcfTd"+ Generator.getRandomNumber()) { @Override public void run() { Handler h = new Handler(Looper.getMainLooper()); Object response = null; for(int i=0; i<4; i++) { response = send(envelope, httpTransport_net , METHOD_NAME, null); try {if(Thread.currentThread().isInterrupted()) return;}catch(Exception e){} if(response != null) break; ThreadHelper.threadSleep(250); } if(response != null) { if(rp != null) { rp.setArguments(response.toString()); h.post(rp); } } else { if(Thread.currentThread().isInterrupted()) return; if(rp != null) { rp.setExceptionState(true); h.post(rp); } } ThreadHelper.stopThread(this); } }; thread.start(); return thread; } private static Object send(SoapSerializationEnvelope envelope, HttpTransportSE androidHttpTransport, String METHOD_NAME, List<HeaderProperty> headerList) { try { if(headerList != null) androidHttpTransport.call(SOAP_ACTION + METHOD_NAME, envelope, headerList); else androidHttpTransport.call(SOAP_ACTION + METHOD_NAME, envelope); Object res = envelope.getResponse(); if(res instanceof SoapPrimitive) return (SoapPrimitive) envelope.getResponse(); else if(res instanceof SoapObject) return ((SoapObject) envelope.getResponse()); } catch(Exception e) {} return null; } public static KeyStore getFromRaw(@RawRes int id, String algorithm, String filePassword) { try { InputStream inputStream = ResourceMaster.openRaw(id); KeyStore keystore = KeyStore.getInstance(algorithm); keystore.load(inputStream, filePassword.toCharArray()); inputStream.close(); return keystore; } catch(Exception e) {} return null; } public static SSLSocketFactory getSSLSocketFactory(KeyStore trustKey, String SSLAlgorithm) { try { TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustKey); SSLContext context = SSLContext.getInstance(SSLAlgorithm);//"SSL" "TLS" context.init(null, tmf.getTrustManagers(), null); return context.getSocketFactory(); } catch(Exception e){} return null; }

}