¿Cómo evito el error "No peer certificate" al conectarme a este sitio HTTPS en Android?

Estoy desarrollando una aplicación de Android que necesita acceder al servicio de QuickPay (" https://secure.quickpay.dk/form ") a través de un cliente Http. Pero sigo recibiendo errores al acceder a la página. Más específicamente, obtengo un mensaje de error "No Peer Certificate". Ya he probado varias cosas diferentes: He intentado agregar el certificado raíz a mi almacén de claves, y usar este almacén de claves al conectar, siguiendo este procedimiento: agregar certificado a keystore . También intenté aceptar todos los certificados, siguiendo el método propuesto de aquí: aceptando el certificado para androide . He conectado con éxito a otros sitios de https, pero no puedo conectar con éste. He probado en diferentes dispositivos Android (1.6, 2.2 y 2.3.3). ¿Puede alguien tener éxito en la conexión al sitio de pago rápido, o puede alguien llegar a una posible solución / solución?

// Actualización: si accedo a este sitio con mi WebView: ejemplos de la ventana de pago , y presiono uno de los botones (que básicamente acaba de lanzar un post http con algunas variables predefinidas) puedo conectarme al sitio en la vista web de Android 2.3.3. Además, me enteré de que recibo una respuesta del sitio si intento iniciar la aplicación anterior en Android 3.1! ¿Alguna sugerencia?

public class MyHttpClient extends DefaultHttpClient { final Context context; public MyHttpClient(Context context) { this.context = context; loadHttps(); } private void loadHttps() { String url = "https://secure.quickpay.dk/form"; HttpPost httpPost = new HttpPost(url); try { System.out.println("Executing"); this.execute(httpPost); } catch (UnsupportedEncodingException e) { System.out.println(e.getMessage()); } catch (ClientProtocolException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e); } } @Override protected ClientConnectionManager createClientConnectionManager() { SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", newSslSocketFactory(), 443)); return new SingleClientConnManager(getParams(), registry); } private SSLSocketFactory newSslSocketFactory() { try { KeyStore trusted = KeyStore.getInstance("BKS"); InputStream in = context.getResources().openRawResource(R.raw.test); try { trusted.load(in, "mysecret".toCharArray()); } finally { in.close(); } SSLSocketFactory sf = new SSLSocketFactory(trusted); return sf; } catch (Exception e) { throw new AssertionError(e); } } 

}


StackTrace:

 WARN/System.err(8459) at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java 258) WARN/System.err(8459) at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java 93) WARN/System.err(8459) at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java 381) WARN/System.err(8459) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java 177) WARN/System.err(8459) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java 164) WARN/System.err(8459) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java 119) WARN/System.err(8459) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java 359) WARN/System.err(8459) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 555) WARN/System.err(8459) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 487) WARN/System.err(8459) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java 465) WARN/System.err(8459) at test.https.MyHttpClient.loadHttps(MyHttpClient.java 34) WARN/System.err(8459) at test.https.MyHttpClient.<init>(MyHttpClient.java 26) WARN/System.err(8459) at test.https.HttpsTesterActivity.onCreate(HttpsTesterActivity.java 60) WARN/System.err(8459) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java 1047) WARN/System.err(8459) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java 1615) WARN/System.err(8459) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java 1667) WARN/System.err(8459) at android.app.ActivityThread.access$1500(ActivityThread.java 117) WARN/System.err(8459) at android.app.ActivityThread$H.handleMessage(ActivityThread.java 935) WARN/System.err(8459) at android.os.Handler.dispatchMessage(Handler.java 99) WARN/System.err(8459) at android.os.Looper.loop(Looper.java 123) WARN/System.err(8459) at android.app.ActivityThread.main(ActivityThread.java 3687) WARN/System.err(8459) at java.lang.reflect.Method.invokeNative(Native Method) WARN/System.err(8459) at java.lang.reflect.Method.invoke(Method.java 507) WARN/System.err(8459) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java 842) WARN/System.err(8459) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java 600) 

Para resumir, arreglé este problema siguiendo el enfoque de WebView. La interacción con la API se trasladó a un servidor, creando un punto de comunicación intermedio que maneja los problemas de certificado. No es la solución más elegante, pero funciona 🙂

Esto es muy misterioso. La única forma en que un servidor HTTPS / SSL puede evitar el envío de un certificado es si ambas partes están de acuerdo en operar la conexión SSL en sentido inverso, donde el servidor es el cliente SSL y el cliente es el servidor SSL, por lo que el certificado viaja en la otra dirección. Pero no puedo ver nada en tu código que habilite ese modo, y tendría que estar habilitado en el otro extremo también. Y tendrías que estar proporcionando un certificado tú mismo desde tu almacén de llaves … Muy extraño.

Intente utilizar la clase UrlConnection para establecer conexiones y ver si puede evitar este error de "no peer certificate".

  • Soporte de TLS v1.2 en Webview Android
  • Certificado SSL para los servicios web REST (utilizados por Android)?
  • Error de protocolo desconocido con conexión HTTPS en android
  • Javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado de compañero mientras estoy trabajando con google place api en android
  • OKhttp: SSLProtocolException: Protocolo de enlace SSL finalizado
  • Certificado ssl de android
  • Cómo deshabilitar SSLbackbackback con okhttp
  • Aplicación androide "Sin certificado par"
  • SSLHandshakeException: Handshake falló en Android N / 7.0
  • Cómo proteger la llamada a webservice en Android
  • No es un certificado de confianza que utiliza ksoap2-android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.