Ich habe damit zu tun und ehrlich gesagt erlaubt MITM-Angriffe ist ein Oh nein. Hier ist eine sauberere Lösung, die das Pinning unterstützt. Speichern Sie das Zertifikat in Ihrem Raw-Ressourcenordner.
HINWEIS: Leider gibt SSLError uns ein SslCertificate, wenn Sie getCertificate() aufrufen. SslCertificate ist irgendwie nutzlos. Es ist öffentliche API ermöglicht es Ihnen nicht, den öffentlichen Schlüssel zu überprüfen, nur das erstellt am, abgelaufenes Datum, ausgestellt von, ausgestellt von. Wenn Sie diese Klasse öffnen, sehen Sie jedoch eine X509Certificate-Membervariable, die nicht exposed ist. IDK, warum diese Designentscheidung getroffen wurde. Aber es gibt eine API zum Abrufen des Bundles, und die X509-Zertifikat-Mitgliedsvariable wird dort gespeichert. Also greifen wir auf diese Weise zu, weil das Zertifikat viel mehr nützliche Methoden enthält.
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
SslCertificate sslCertificateServer = error.getCertificate();
Certificate pinnedCert = getCertificateForRawResource(R.raw.your_cert, mContext);
Certificate serverCert = convertSSLCertificateToCertificate(sslCertificateServer);
if(pinnedCert.equals(serverCert)) {
handler.proceed();
} else {
super.onReceivedSslError(view, handler, error);
}
}
public static Certificate getCertificateForRawResource(int resourceId, Context context) {
CertificateFactory cf = null;
Certificate ca = null;
Resources resources = context.getResources();
InputStream caInput = resources.openRawResource(resourceId);
try {
cf = CertificateFactory.getInstance("X.509");
ca = cf.generateCertificate(caInput);
} catch (CertificateException e) {
Log.e(TAG, "exception", e);
} finally {
try {
caInput.close();
} catch (IOException e) {
Log.e(TAG, "exception", e);
}
}
return ca;
}
public static Certificate convertSSLCertificateToCertificate(SslCertificate sslCertificate) {
CertificateFactory cf = null;
Certificate certificate = null;
Bundle bundle = sslCertificate.saveState(sslCertificate);
byte[] bytes = bundle.getByteArray("x509-certificate");
if (bytes != null) {
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
certificate = cert;
} catch (CertificateException e) {
Log.e(TAG, "exception", e);
}
}
return certificate;
}
bitte akzeptieren ... –
das gleiche mit Anon sein '' 'webView.setWebViewClient (neu WebViewClient() { @Override public void onReceivedSslError (WebView Ansicht, SslErrorHandler Handler, SslError Fehler) { handler.proceed(); } }); '' ' – tyoc213
genau was ich brauche .. – MKY