2011-09-28 6 views
5

Sto sviluppando un'applicazione Android che deve accedere al servizio di QuickPay ("https://secure.quickpay.dk/form") tramite un client Http. Ma continuo a ricevere errori quando accedo alla pagina. Più in particolare ottengo un messaggio di errore "No Peer Certificate". Ho già provato diverse cose: Ho provato ad aggiungere il certificato di root al mio keystore ea utilizzare questo keystore durante la connessione, seguendo questa procedura: adding certificate to keystore. Ho anche provato ad accettare tutti i certificati, seguendo il metodo proposto da qui: accepting certificate for android. Mi sono collegato correttamente ad altri siti https, ma non riesco a connettermi a questo. Ho provato diversi dispositivi Android (1.6, 2.2 e 2.3.3). Qualcuno può riuscire a connettersi al sito di quickpay o qualcuno può trovare una soluzione/soluzione?Come evitare di ricevere l'errore "Nessun certificato peer" durante la connessione a questo sito HTTPS su Android?

// Aggiornamento: se accedo a questo sito con la mia WebView: payment window examples, e premo uno dei pulsanti (che in pratica lancia solo un post http con alcune variabili predefinite) Sono in grado di connettermi al sito nel visualizzazione Web su Android 2.3.3. Inoltre, ho scoperto che ottengo una risposta dal sito se provo a lanciare la suddetta applicazione su Android 3.1! Eventuali suggerimenti?

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) 
+0

È il certificato che si sta ottenendo un certificato generico del sito o si tratta di un certificato personale (o aziendale) ricevuto da QuickPay? Che formato è? PKX? p12? –

+1

Si prega di inviare l'intero messaggio e traccia dello stack. – EJP

+0

@PeterKnego, ho scaricato il certificato di root dal sito di QuickPay tramite il mio browser. Il certificato è stato dato da Equifax. Ho quindi convertito il certificato in un certificato p12 per caricarlo su Android. –

risposta

1

Giusto per riassumere, ho risolto questo problema attenendosi all'approccio WebView. L'interazione con l'API è stata spostata su un server, creando un punto di comunicazione intermedio che gestisce i problemi del certificato. Non è la soluzione più elegante ma funziona :)

0

Questo è molto misterioso. L'unico modo in cui un server HTTPS/SSL può evitare di inviare un certificato è se entrambe le parti accettano di operare la connessione SSL al contrario, dove il server è il client SSL e il client è il server SSL, quindi il certificato viaggia nella direzione opposta. Ma non riesco a vedere nulla nel tuo codice che abiliti quella modalità, e dovrebbe essere abilitato anche dall'altra parte. E tu dovresti fornire un certificato dal tuo keystore ... Molto strano.

+0

Fornisco un certificato, qui chiamato "test", che carico dalle mie risorse "raw" (vedi il codice sopra). Questo è il certificato radice convertito che ho ottenuto e salvato con il mio browser. –

0

Provare a utilizzare la classe UrlConnection per effettuare le connessioni e vedere se è possibile evitare questo errore "no peer certificate".

Problemi correlati