avevo a che fare con questo e francamente permettendo attacchi MITM è un o-no. Ecco una soluzione più pulita che supporta il fissaggio. Salva il certificato nella cartella delle risorse raw.
NOTA: Purtroppo, SSLError ci fornisce un certificato Ssl quando chiami getCertificate(). SslCertificate è una specie di inutile. La sua API pubblica non consente di verificare la chiave pubblica, solo la data di creazione, scaduta, rilasciata a, emessa da. Tuttavia, se apri questa classe vedrai una variabile membro X509Certificate non esposta. IDK perché questa decisione progettuale è stata presa. Ma c'è un'API per ottenere il pacchetto e quella variabile membro del certificato X509 viene memorizzata lì. Quindi accediamo in questo modo, perché il certificato ha molti più metodi utili su di esso.
@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;
}
fonte
2017-04-24 17:41:14
Voglia gradire ... –
sarà lo stesso con anon '' 'webView.setWebViewClient (nuova WebViewClient() { @Override pubblico onReceivedSslError void (vista WebView, gestore SslErrorHandler, errore SslError) { handler.proceed(); } }); '' ' – tyoc213
esattamente ciò di cui ho bisogno .. – MKY