Ich mache einen https-Beitrag und erhalte eine Ausnahme von der SSL-Ausnahme. Nicht vertrauenswürdiges Serverzertifikat. Wenn ich normales http mache, funktioniert es einwandfrei. Muss ich das Serverzertifikat irgendwie akzeptieren?
100
Antworten:
Ich vermute, aber wenn Sie möchten, dass ein tatsächlicher Handschlag stattfindet, müssen Sie Android über Ihr Zertifikat informieren. Wenn Sie einfach akzeptieren möchten, egal was passiert, verwenden Sie diesen Pseudocode, um das zu erhalten, was Sie mit dem Apache HTTP-Client benötigen:
CustomSSLSocketFactory:
FullX509TrustManager ist eine Klasse, die implementiert javax.net.ssl.X509TrustManager, doch keines der Verfahren tatsächlich keine Arbeit ausführen, um eine Probe erhalten hier .
Viel Glück!
quelle
FullX509TrustManager
Das mache ich. Das Zertifikat wird einfach nicht mehr überprüft.
und
quelle
javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
. Ich habe auch versucht , ErsatzTLS
mit ,SSL
aber es hat nicht geholfen. Bitte helfen Sie mir, dankeBeim Versuch, diese Frage zu beantworten, habe ich ein besseres Tutorial gefunden. Damit müssen Sie die Zertifikatsprüfung nicht gefährden.
http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
* Ich habe das nicht geschrieben, aber danke an Bob Lee für die Arbeit
quelle
Sie können sich auch meinen Blog-Artikel ansehen, der den Crazybobs sehr ähnlich ist.
Diese Lösung beeinträchtigt auch nicht die Zertifikatsprüfung und erklärt, wie Sie die vertrauenswürdigen Zertifikate in Ihrem eigenen Schlüsselspeicher hinzufügen.
http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/
quelle
http://madurangasblogs.blogspot.in/2013/08/avoiding-javaxnetsslsslpeerunverifiedex.html
Mit freundlicher Genehmigung von Maduranga
Bei der Entwicklung einer Anwendung, die https verwendet, verfügt Ihr Testserver nicht über ein gültiges SSL-Zertifikat. Oder manchmal verwendet die Website ein selbstsigniertes Zertifikat oder die Website verwendet ein kostenloses SSL-Zertifikat. Wenn Sie also versuchen, mit Apache
HttpClient
eine Verbindung zum Server herzustellen , wird eine Ausnahme angezeigt, die besagt, dass der Peer nicht authentifiziert ist. Obwohl es nicht empfehlenswert ist, allen Zertifikaten einer Produktionssoftware zu vertrauen, müssen Sie dies möglicherweise je nach Situation tun. Diese Lösung behebt die Ausnahme, die durch "Peer nicht authentifiziert" verursacht wird.Bevor wir jedoch zur Lösung gehen, muss ich Sie warnen, dass dies keine gute Idee für eine Produktionsanwendung ist. Dies verstößt gegen den Zweck der Verwendung eines Sicherheitszertifikats. Verwenden Sie diese Lösung nicht, es sei denn, Sie haben einen guten Grund oder sind sich sicher, dass dies keine Probleme verursacht.
Normalerweise erstellen Sie eine
HttpClient
solche.HttpClient httpclient = new DefaultHttpClient();
Sie müssen jedoch die Art und Weise ändern, wie Sie den HttpClient erstellen.
Zuerst müssen Sie eine Klassenerweiterung erstellen
org.apache.http.conn.ssl.SSLSocketFactory
.Erstellen Sie dann eine Methode wie diese.
Dann können Sie die erstellen
HttpClient
.HttpClient httpclient = getNewHttpClient();
Wenn Sie versuchen, eine Post-Anfrage an eine Anmeldeseite zu senden, sieht der Rest des Codes folgendermaßen aus.
Sie erhalten die HTML-Seite zum InputStream. Dann können Sie mit der zurückgegebenen HTML-Seite tun, was Sie wollen.
Aber hier werden Sie vor einem Problem stehen. Wenn Sie eine Sitzung mithilfe von Cookies verwalten möchten, können Sie dies mit dieser Methode nicht tun. Wenn Sie die Cookies erhalten möchten, müssen Sie dies über einen Browser tun. Dann erhalten nur Sie Cookies.
quelle
Wenn Sie ein StartSSL- oder Thawte-Zertifikat verwenden, schlägt dies für Froyo und ältere Versionen fehl. Sie können das CAcert-Repository einer neueren Version verwenden, anstatt jedem Zertifikat zu vertrauen.
quelle
Keines davon hat bei mir funktioniert (was auch durch den Thawte-Bug noch verstärkt wurde ). Schließlich habe ich es mit selbstsignierter SSL-Akzeptanz unter Android behoben und die benutzerdefinierte SSL-Verarbeitung funktionierte unter Android 2.2 FroYo nicht mehr
quelle
Jede dieser Antworten hat bei mir nicht funktioniert. Hier ist ein Code, der Zertifikaten vertraut.
quelle
Ich weiß nichts über die Android-Besonderheiten für SSL-Zertifikate, aber es wäre sinnvoll, dass Android ein selbstsigniertes SSL-Zertifikat nicht sofort akzeptiert. Ich habe diesen Beitrag in Android-Foren gefunden, der anscheinend dasselbe Problem behebt : http://androidforums.com/android-applications/950-imap-self-signed-ssl-certificates.html
quelle
Dies ist ein bekanntes Problem mit Android 2.x. Ich hatte eine Woche lang mit diesem Problem zu kämpfen, bis ich auf die folgende Frage stieß, die nicht nur einen guten Hintergrund des Problems liefert, sondern auch eine funktionierende und effektive Lösung ohne Sicherheitslücken bietet.
Fehler 'Kein Peer-Zertifikat' in Android 2.3, aber NICHT in 4
quelle
Aus irgendeinem Grund hat die oben für httpClient erwähnte Lösung bei mir nicht funktioniert. Am Ende konnte ich es zum Laufen bringen, indem ich die Methode bei der Implementierung der benutzerdefinierten SSLSocketFactory-Klasse korrekt überschrieb.
So hat es bei mir perfekt funktioniert. Sie können die vollständige benutzerdefinierte Klasse und Implementierung im folgenden Thread sehen: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/
quelle
Ich mache diese Klasse und gefunden
in dir Code weiß das
quelle
Quellen, die mir geholfen haben, mit meinem selbstsignierten Zertifikat auf meinem AWS Apache-Server zu arbeiten und eine Verbindung mit HttpsURLConnection vom Android-Gerät herzustellen:
SSL auf einer aws-Instanz - Amazon-Tutorial zu SSL
Android Security mit HTTPS und SSL - Erstellen eines eigenen Vertrauensmanagers auf dem Client zum Akzeptieren Ihr Zertifikat
Selbstsigniertes Zertifikat erstellen - einfaches Skript zum Erstellen Ihrer Zertifikate
Dann habe ich folgendes gemacht:
create_my_certs.sh
:bash create_my_certs.sh yourdomain.com
Platzieren Sie die Zertifikate an der richtigen Stelle auf dem Server (die Konfiguration finden Sie unter /etc/httpd/conf.d/ssl.conf). All dies sollte festgelegt werden:
SSLCertificateFile
SSLCertificateKeyFile
SSLCertificateChainFile
SSLCACertificateFile
Starten Sie httpd mit neu
sudo service httpd restart
und stellen Sie sicher, dass httpd gestartet wurde:Stoppen von httpd: [OK]
Starten von httpd: [OK]
Kopieren Sie
my-private-root-ca.cert
in Ihren Android-Projekt-Assets-OrdnerErstellen Sie Ihren Vertrauensmanager:
SSLContext SSLContext;
CertificateFactory cf = CertificateFactory.getInstance ("X.509"); InputStream caInput = context.getAssets (). Open ("my-private-root-ca.cert.pem"); Zertifikat ca; try {ca = cf.generateCertificate (caInput); } finally {caInput.close (); }}
Und stellen Sie die Verbindung mit HttpsURLConnection her:
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection (); connection.setSSLSocketFactory (SSLContext.getSocketFactory ());
Versuchen Sie es mit Ihrer https-Verbindung.
quelle
Wahrscheinlich können Sie so etwas versuchen. Das hat mir geholfen
quelle
Verwenden Sie einfach diese Methode als HTTPClient:
quelle