Probleme mit https (kein Peer-Zertifikat) in Android

Problem

Ich möchte die https-Anforderung an die Website https://10.2.20.20/fido/EzPay/login.php senden, meinen eigenen Server und bekomme Antwort von ihm und speichere sie zB in einem String. Ich habe einige Beispielcodes im Internet gefunden und versuche, sie für mein Problem zu testen, aber sie sind nicht hilfreich. Im Folgenden präsentiere ich einige Teile von Codes, die ich getestet habe.


Code Beispiel:

Ich versuche diesen Code, aber ich bekomme immer die gleiche Ausnahme "Kein Peer-Zertifikat" Warum?

try { HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; DefaultHttpClient client = new DefaultHttpClient(); SchemeRegistry registry = new SchemeRegistry(); SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); registry.register(new Scheme("https", socketFactory, 443)); SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry); DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams()); // Set verifier HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); // Example send http request final String url = "https://10.2.20.20/fido/EzPay/login.php"; HttpPost httpPost = new HttpPost(url); HttpResponse response = httpClient.execute(httpPost); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { Log.i(DownloadImageTask.class.getName(), line); } } catch(IOException ex) { Log.e(DownloadImageTask.class.getName(), ex.getMessage()); } 

Ausnahme.

03-02 16: 58: 25.234: W / System.err (1868): javax.net.ssl.SSLPeerUnverifiedException: Kein Peer-Zertifikat 03-02 16: 58: 25.238: W / System.err (1868): bei org. Apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates (SSLSessionImpl.java:137) 03-02 16: 58: 25.238: W / System.err (1868): bei org.apache.http.conn.ssl.AbstractVerifier .verify (AbstractVerifier.java:93) 03-02 16: 58: 25.238: W / System.err (1868): bei org.apache.http.conn.ssl.SSLSocketFactory.createSocket (SSLSocketFactory.java:381) 03- 02 16: 58: 25.238: W / System.err (1868): bei org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection (DefaultClientConnectionOperator.java:165) 03-02 16: 58: 25.250: W / System. Err (1868): bei org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:164) 03-02 16: 58: 25.250: W / System.err (1868): bei org.apache.http .impl.conn.AbstractPooledConnAdapter.open (AbstractPooledConnAdapter.java:119) 03-02 16: 58: 25.250: W / System.err (1868): bei org.apache.http.impl.client.DefaultRequestDirector.execut E (DefaultRequestDirector.java:360) 03-02 16: 58: 25.250: W / System.err (1868): bei org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:555) 03-02 16: 58: 25.250: W / System.err (1868): bei org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:487) 03-02 16: 58: 25.250: W / System.err (1868): bei org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:465) 03-02 16: 58: 25.250: W / System.err (1868): bei com.https.test. DownloadImageTask.doInBackground (Https_testActivity.java:78) 03-02 16: 58: 25.250: W / System.err (1868): bei com.https.test.DownloadImageTask.doInBackground (Https_testActivity.java:1) 03-02 16: 58: 25.250: W / System.err (1868): bei android.os.AsyncTask $ 2.call (AsyncTask.java:264) 03-02 16: 58: 25.253: W / System.err (1868): bei Java. (Konkurrenz) ) 03-02 16: 58: 25.253: W / System.err (1868): bei und Roid.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:208) 03-02 16: 58: 25.257: W / System.err (1868): bei java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1076) 03-02 16: 58: 25.257: W / System.err (1868): bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:569) 03-02 16: 58: 25.257: W / System.err (1868): bei java.lang.Thread.run (Thread.java:856)


Frage

Was mache ich falsch und wie kann ich dieses Problem lösen. Warum bekomme ich " keine Peer-Zertifikat " Ausnahme?

Vielen Dank.

Bearbeitet


Windows Server-Einstellungen.

 <VirtualHost *:443> ServerName 10.2.20.20 Alias /fido/EzPay/ "d:/fido/EzPay/" Alias /fido/EzPay "d:/fido/EzPay/" <Directory "d:/fido/EzPay/"> Options Indexes FollowSymLinks MultiViews AllowOverride all Order allow,deny Allow from all </Directory> # These are the actual SSL directives needed to get it all working! SSLEngine on SSLCertificateFile C:/wamp/bin/apache/apache2.2.17/conf/ssl/fidoserver.crt SSLCertificateKeyFile C:/wamp/bin/apache/apache2.2.17/conf/ssl/fidoserver.pem </VirtualHost> 

  • Android wie man ein TimerTask Intervall nach Shcedule ändern?
  • Java: Aufruf der äußeren Klassenmethode in anonymer innerer Klasse
  • Bluetooth Verbindung fehlgeschlagen "java.io.IOException: read failed, Socket könnte geschlossen oder Timeout, lesen ret: -1"
  • Java, HttpURLConnection und Einstellung der Inhaltslänge
  • Einreichung von Scores an Google Play Games-Ranglisten und Anzeige neuer Rang (e)
  • Wie mache ich ein Overlay beim Teilen in App in Android?
  • Android: NAT Traversal?
  • Java.lang.Runtime Ausnahme: Take Picture fehlgeschlagen?
  • 3 Solutions collect form web for “Probleme mit https (kein Peer-Zertifikat) in Android”

    Schließlich habe ich https problem gelöst. Als ich kämpfte das Hauptproblem war im Server, konkret in Zertifikat. Android unterstützt nur "BKS" Zertifikat und das war der Grund, dass wir keine Antwort vom Server bekommen können. Um dieses Problem zu lösen, habe ich mehr als 30 Artikel gelesen und habe endlich eine Lösung gefunden.

    Die Schritte, die ich getan habe, um dieses Problem zu lösen, können Sie unten sehen:

    Das erste, was ich tat, war die Erstellung von .bks Keystore-Datei aus unserem fidoserver.crt Zertifikat, um das zu tun, dass ich diesen Artikel gelesen habe und folgendes tun:

    1. Öffnen Sie cmd
    2. Gehe zum JDK-Ordner "cd X: \ Programme \ Java \ Jdk6 \ bin"
    3. Aufruf folgenden Befehl:

    Keytool -import -alias tomcat -file X: //KeyStore/fidoserver.crt -keypass passwort – keystore X: //KeyStore/keystore.bks -storetype BKS -Storepass 222222 -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath X: //KeyStore/bcprov-jdk16-146.jar

    Vor dem Ausführen dieses Befehls habe ich Download Bouncy Castle .jar Datei und legte es in den Ordner mit Zertifikaten. Nach diesem Schritt alle Schritte bekomme ich keystore.bks Datei, die die richtige Zertifikat-Datei für Android-Anwendung ist. Ich habe diese Datei in Androids mnc / sdcard Ordner. In Java-Code habe ich schreiben folgenden Code zu lesen, dass keystore.bbk Datei

     KeyStore trustStore = KeyStore.getInstance( "BKS" /*KeyStore.getDefaultType()*/ ); FileInputStream instream = new FileInputStream(new File("/mnt/sdcard/keystore.bks")); try { trustStore.load(instream, "222222".toCharArray()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { instream.close(); } catch (Exception ignore) {} } // Create socket factory with given keystore. SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore); SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore); Scheme sch = new Scheme("https", socketFactory, 443); httpclient.getConnectionManager().getSchemeRegistry().register(sch); HttpGet httpget = new HttpGet("https://10.2.20.20/fido/EzPay/login.php"); System.out.println("executing request " + httpget.getRequestLine()); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); } // Print html. BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = ""; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); 

    Dies alles erlaubt m, um unser Zertifikat mit gegebenem Passwort zu laden 222222 (Passwort geben wir bei der Erstellung eines Schlüssels mit Keytool).

    Danach beginnen alle meine Testanwendungen richtig zu arbeiten. Jetzt kann ich eine Anfrage an https senden und von ihr Antwort bekommen. Ich habe Anwendung mit FIDO Server getestet, alles funktioniert super! Ich denke am Montag werde ich einige Änderungen in der EzPay-Anwendung vornehmen und es wird mit https-Verbindungen beginnen.

    Referenzen

    • Verwenden von TLS mit Apache Tomcat und Android
    • SSL-Überprüfung für Android-Anwendungen
    • KeyStore
    • Android: Trusting SSL Zertifikate
    • Hüpfburg
    • Android / Java – Erstellen von HTTPS-Verbindungen?

    Die Anforderungsmethode POST ist für die URL / unangemessen. Das ist alles was wir wissen.

    Beispiel 1 funktioniert nicht, weil es scheint, dass Sie keine POST Anfrage an diese Seite senden dürfen. Versuchen:

     /* ... */ HttpGet httpGet = new HttpGet(url); HttpResponse response = httpClient.execute(httpGet); /* ... */ 

    Beispiel 2 funktioniert nicht, weil man das Website-Zertifikat nicht als akzeptiertes Zertifikat akzeptiert, also sollte es auch so sein:

     /* ... */ HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; SchemeRegistry registry = new SchemeRegistry(); SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); registry.register(new Scheme("https", socketFactory, 443)); SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry); DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams()); /* ... */ 

    Hast du versucht, die Seite mit einem Browser zu öffnen? Wenn es nicht öffnet, ist Ihre Konfiguration falsch.

    Beachten Sie, wenn Sie mit einem Self-Signed-Zertifikat einige Verbindungsprobleme erhalten können. Einige Android-Kernel-Versionen (vor 2.6.32.9) nicht wie Self-Singed-Zertifikate.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.