回答
不是专家,只是我可以在网上找到。 据我所知,WebView确实支持ssl,但是,空白屏幕表明WebView不相信证书是有效的。这可能会发生在自签名证书或未在android中设置的根认证(完全有效的证书未验证)。在任何情况下,如果您使用的是升级Froyo或更好的,你可以尝试这样的:
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.SslErrorHandler;
import android.net.http.SslError;
...
engine = (WebView) findViewById(R.id.my_webview);
engine.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
奇怪的是,这不是一个自我签署的证书.. – 2011-05-12 13:12:52
嗯,好吧,看起来更进一步我发现WebView确实支持SSL。它具有'getCertificate()','clearSslPreferences()'和'setCertificate(SslCertificate证书)'方法。正如我所看到的那样,问题是让webkit告诉我们问题是什么。在检查时,你可能会看到[this](http://developer.android.com/reference/android/webkit/SslErrorHandler.html),这是ssl错误处理。 – chris 2011-05-12 13:48:38
@chris你说这适用于froyo或更好,我正在使用,但SslErrorHandler和SslError'都不能解析为类型,我不能导入任何...任何建议? – RyanG 2011-09-09 15:51:23
您必须启用的WebView设置来查看基于SSL的网站:
webView.getSetting().setDomStorageEnable(true);
要正确处理SSL证书validationoogle戏根据更新的安全策略,当服务器提供的证书满足您的期望时,更改您的代码以调用SslErrorHandler.proceed(),否则调用SslErrorHandler.cancel()。
例如,我添加了一个警告对话框,让用户确认并且似乎Google不再显示警告。
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
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();
}
在此更改后,它不会显示警告。
非常感谢你们,它像一个魅力。 +1 – 2018-01-23 09:34:11
谷歌拒绝打我的应用程序,然后我做了这...
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
try {
//Get the X509 trust manager from your ssl certificate
X509TrustManager trustManager = mySslCertificate.getX509TrustManager();
//Get the certificate from error object
Bundle bundle = SslCertificate.saveState(error.getCertificate());
X509Certificate x509Certificate;
byte[] bytes = bundle.getByteArray("x509-certificate");
if (bytes == null) {
x509Certificate = null;
} else {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
x509Certificate = (X509Certificate) cert;
}
X509Certificate[] x509Certificates = new X509Certificate[1];
x509Certificates[0] = x509Certificate;
// check weather the certificate is trusted
trustManager.checkServerTrusted(x509Certificates, "ECDH_RSA");
Log.e(TAG, "Certificate from " + error.getUrl() + " is trusted.");
handler.proceed();
} catch (Exception e) {
Log.e(TAG, "Failed to access " + error.getUrl() + ". Error: " + error.getPrimaryError());
final AlertDialog.Builder builder = new AlertDialog.Builder(WebViewActivity.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();
}
}
作出上述改变谷歌Play上我的APK后
,并生成您的SSL信任管理器请选中该answer
非常感谢你:)我是如此接近解决方案,你帮我完成它:) – Viktor 2018-02-27 14:16:07
@Viktor欢迎队友:) – 2018-02-28 07:51:43
- 1. 检测是否支持SSL
- 2. Android SSL支持
- 3. Android的SSL - SNI支持
- 4. Android上支持双向SSL握手吗?
- 5. RESTeasy客户端是否支持TLS/SSL?
- 6. ObjCMongoDB是否支持SSL连接?
- 7. 如何检查curl是否支持ssl?
- 8. Linux上的MySQL ++ SSL支持
- 9. 是否有支持JavaScript视图的ASP.Net MVC视图引擎?
- 10. iOS是否支持基于视图的表格视图?
- 11. Android 4.0.3是否支持SIP?
- 12. Android WebDriver是否支持set_page_load_timeout?
- 13. Phonegap是否支持Android 1.6?
- 14. Android是否支持jQuery?
- 15. Android WebView是否支持html5?
- 16. Android 3.0是否支持WebSockets?
- 17. WebMango是否支持上传DICOM图像?
- 18. 可视化Web部件是否支持设计器中的ObjectDataSource?
- 19. gmail登录不支持在web视图
- 20. HTML5是否支持视频的HTTP Psuedostreaming?
- 21. OpenXava框架是否支持Web服务?
- 22. wireshark是否支持Web前端?
- 23. Informatica Web Services Hub v9是否支持MTOM?
- 24. 确定Web存储是否受支持
- 25. Cobalt RC 11是否支持Web Audio API
- 26. WSO2 ESB是否支持Web套接字?
- 27. 支持Android 2.2中的Carousel视图
- 28. Android是否支持Google地图上的Geo Fencing,以及支持Geo fencing的最早平台是什么?
- 29. 是否支持Android的SQLite事务?
- 30. Android是否支持使用HTML5视频标签的RTSP流?
你可以打开网页应用程序中的构建网页吗? – Mannaz 2011-05-12 13:29:01