it-swarm.com.de

android Webview mit Client-Zertifikat

Ich habe seit Tagen versucht, eine Webansicht mit einem in die Anwendung eingebetteten Clientzertifikat zu verwenden, aber mir scheint, dass die Android-SDK keine Möglichkeit dafür bietet. Gibt es einen Rückruf, um die vom Server gesendete Herausforderung abzufangen? Gibt es eine Möglichkeit, Webview mit einem Clientzertifikat zu verwenden und eine https-Anfrage zu stellen? 

18
user2202628

Da ich auch an Ihrem Problem interessiert bin, habe ich die Dokumentation für WebView und WebViewClient durchgesehen, herumgesurft und tatsächlich sieht es so aus, dass Sie eine Webview-Sitzung nicht mit einem Clientzertifikat authentifizieren können, da die erforderliche Methode (ClientCertRequestHandler) keine ist öffentliche API.

Verwenden einer Android-WebView zum Herstellen einer Verbindung zum sicheren Server mit Client-Zertifikat

Eine Suche in den Android-Sicherheitsdiskussionen bestätigt, dass der Anruf tatsächlich nicht verfügbar ist:

https://groups.google.com/forum/#!msg/Android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J

und obwohl

Die Android 4.0-Version unterstützt die Authentifizierung von Clientzertifikaten im Browser.

(ref: https://code.google.com/p/Android/issues/detail?id=8196 )

es wird keine Erwähnung über WebViews gemacht :(

Es gibt zwar einige neue APIs zum Laden von Zertifikaten in einem Schlüsselbund:

http://developer.Android.com/reference/Android/security/KeyChain.htmlhttp://nelenkov.blogspot.it/2011/11/using-ics-keychain-api. html

es ist nicht klar, ob das WebView sie verwenden wird. Ich denke, Sie sollten die KeyChain-Klasse ausprobieren und sehen, ob Sie sich richtig authentifizieren können (ich habe keine einfache Möglichkeit, dies zu testen, Sie sind also alleine).

Wenn KeyChain nicht mit WebViews funktioniert, denke ich, es läuft alles auf ein paar weit entfernte perfekte Lösungen hinaus:

Lösung 1: 

verwenden Sie ClientCertRequestHandler trotzdem (es ist als versteckt markiert, aber anscheinend noch verwendbar):

https://code.google.com/p/Android/issues/detail?id=53491

Allerdings geht man auch davon aus, dass man es schafft, die Android-Dev. Das Team kann die Methode ohne vorherige Ankündigung ändern oder entfernen und Ihre App funktioniert möglicherweise nicht mehr in zukünftigen Versionen der SO.

Lösung 2:

Wenn Sie Ihr Ziel auf Android 4.0 oder neuer beschränken können, besteht eine mutige (und unwahrscheinliche ...) Lösung darin, das Zertifikat in die Webansicht aus Ihrem lokalen Speicher mit einem Dateischema zu laden:

Lokale HTML-Datei in WebView laden

aber ich bezweifle stark, dass sich der Webview wie der Browser verhält ...

Lösung 3: (sollte funktionieren, erfordert aber viel Aufwand)

Behandeln Sie jede https-Verbindung im Hintergrund mithilfe von HTTPClient oder HttpURLConnection, und übergeben Sie die Daten an das WebView:

http://chariotsolutions.com/blog/post/https-with-client-certificates-on/

Sie haben mein Mitgefühl.

50
Rick77

Wenn Sie lediglich SSL-Zertifikatsanforderungen in der Webansicht ignorieren müssen, hat dies für Lollipop funktioniert:

Überschreiben Sie in Ihrem Web View-Client Folgendes:

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

Dies ist hilfreich beim Debuggen von Webviews in qa/dev/stage-Umgebungen.

9
Eduard Kotysh

In API 21 (Android Lollipop) und höher können Sie WebViewClient.onReceivedClientCertRequest (WebView-Ansicht, Anforderung ClientCertRequest) überschreiben. Verwenden Sie in der Methode Ihren Schlüsselmanager, um den privaten Schlüssel und die Zertifikatkette abzurufen, und rufen Sie request.proceed () auf.

Um die SSL-Zertifikatsüberprüfung ordnungsgemäß durchzuführen, um zu verhindern, dass die App gemäß den aktualisierten Sicherheitsrichtlinien von Google Play abgelehnt wird, ändern Sie Ihren Code in SslErrorHandler.proceed (), wenn das vom Server präsentierte Zertifikat Ihre Erwartungen erfüllt, und rufen Sie SslErrorHandler.cancel () auf.

Ich füge zum Beispiel einen Warnungsdialog hinzu, um die Bestätigung durch den Benutzer zu bestätigen, und es scheint, dass Google keine Warnung mehr anzeigt.

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String message = "SSL Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted.";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The certificate Hostname mismatch.";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
        }
        message += " Do you want to continue anyway?";

        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

Nach diesen Änderungen wird keine Warnung angezeigt.

5
Anant Shah

Das Chronium-basierte WebView auf Android 4.4 führte zu einem Fehler: Wenn der Server ein Client-Zertifikat anfordert, stoppt der WebView den Ladevorgang. Die onPageFinished -Methode wird sofort aufgerufen, es wird jedoch keine Seite angezeigt.

-> https://code.google.com/p/Android/issues/detail?id=62533

3
Heiko Maaß

Wir können nicht auf das Clientzertifikat in webview zugreifen, Es wurde ein Google-Problem für dasselbe . https://code.google.com/p/Android/issues/detail?id=53491

0
Swapnil Kale

Selbst signiertes SSL-Zertifikat funktioniert für mich 

Bitte überprüfen Sie diese Antwort https://stackoverflow.com/a/49003522/5058630

0
Gowsik K C