我正在创建一个https用于与服务器通信的android应用程序.我正在使用retrofit并OkHttp提出请求.这些适用于标准http请求.以下是我遵循的步骤.
步骤1: 使用该命令从服务器获取cert文件
echo -n | openssl s_client -connect api.****.tk:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > gtux.cert
Run Code Online (Sandbox Code Playgroud)
步骤2: 使用以下命令将证书转换为BKS格式
keytool -importcert -v -trustcacerts -file "gtux.cert" -alias imeto_alias -keystore "my_keystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-146.jar" -storetype BKS
Run Code Online (Sandbox Code Playgroud)
它问我密码并且文件已成功创建.
第3步:
创建一个OkHttpClient并使用它来发出https请求
public class MySSLTrust {
public static OkHttpClient trustcert(Context context){
OkHttpClient okHttpClient = new OkHttpClient();
try {
KeyStore ksTrust = KeyStore.getInstance("BKS");
InputStream instream = context.getResources().openRawResource(R.raw.my_keystore);
ksTrust.load(instream, "secret".toCharArray());
// TrustManager decides which certificate authorities to …Run Code Online (Sandbox Code Playgroud) 我有一个android工作室项目,调用基于Web的api服务.当服务代码在dev,qa,prod等中时,没有证书问题,但是当试图访问web api开发人员框以测试新功能/错误修复/等时,我得到:
因错误而无法回复:
javax.net.ssl.SSLHandshakeException:链验证失败
在com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:361)
我有从服务开发者机器导出的自签名证书,没有私钥DER编码.我掉到了模拟器上并"安装"但这没有用.
我使用了相同的证书并复制到模拟的SD卡.然后从模拟器中的安全设置安装.结果相同.链验证失败.
现在我的安全/证书知识非常基础.我认为错误实际上描述了这个问题.自签名证书中没有链条......但我可能错了.
无论如何,我该如何解决这个问题?
我希望能够运行我的android代码并点击开发人员框进行测试/调试等.
我已经阅读了这样的帖子,只是为了拥有企业环境,我正在阻止开放SSL等网站.
我通过WebView访问该服务.
任何帮助,指针,想法将不胜感激.
TIA
我试了好几天使用Web视图并在应用程序中嵌入了客户端证书,但在我看来,android sdk没有提供任何方法来执行此操作,是否有回调来拦截服务器发送的质询?有没有办法将webview与客户端证书一起使用并发出https请求?
我的应用程序打开一个Web视图来显示HTML页面,该页面由HTTPS托管,其中包含一个图像(来自http的图像).在某些设备上,图像没有显示,但对于所有其他设备,它的工作正常.我检查了Nexus,三星s6/s4,Moto G2等多种设备.仅在三星S4/S6上,nexus图像未显示.但对于所有其他设备,它的工作正常.即使我尝试使用WI-FI,数据载体和多个操作系统版本,但没有运气.
请帮忙解决这个问题.
一些观察: -
1)在每台设备上我都收到相同的警告: - [已阻止]' page url ' 页面是通过HTTPS加载的,但是显示来自' image source '的不安全内容:此内容也应该通过HTTPS加载.
2)如果我在网络浏览器中打开相同的页面,在所有设备上正常工作.
我的守则
mWebView = (WebView) findViewById(R.id.m_web_view);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mainUrl = bean.getUrl();
mWebView.loadUrl("javascript:window.location.reload( true )");
mWebView.loadUrl(mainUrl);
mWebView.setWebViewClient(new myWebClient());
private class myWebClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//some code
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//some code
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
handler.proceed();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一种在Android Webview中处理SSL证书错误的正确方法.我的目标是提供一种加载具有SSL证书错误的页面的方法,但是当用户尝试加载带有证书错误的URL时,让用户选择在警告他安全性之后加载该页面.
我在线程中找到的最接近的解决方案建议覆盖WebViewClient,如下所示:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
handler.proceed();
}
});
Run Code Online (Sandbox Code Playgroud)
但是,这在没有用户同意的情况下基本上禁用了WebView中的SSL.
这里参考的是我找到解决方案的线程:
在Android中使用WIFI时,Web视图在加载URL后显示空白/白页
Android WebView阻止从https重定向到http
我继续实施了一个略有不同的版本,提示用户:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
//Showing a first confirmation dialog
AndroidUtils.showYesNoDialog(
//First confirmation message
"WARNING - THIS PAGE IS NOT SECURE! Are you sure you want …Run Code Online (Sandbox Code Playgroud) 因此,从我的第一个屏幕开始,我将URL传递给要在webview中启动的活动.但是当webview启动时,它会显示" web page not available - The web page at URL might be temporarily down or it may have moved permanently to a new web address"
但是当我在Android浏览器中启动相同的URL时,它工作正常.这是我在webview中启动该URL的代码
super.onCreate(savedInstanceState);
String url = "";
url = getIntent().getStringExtra("loginURL");
WebView urlWebView = new WebView(this);
urlWebView.setWebViewClient(new WebViewClient());
urlWebView.getSettings().setJavaScriptEnabled(true);
urlWebView.loadUrl(url);
this.setContentView(urlWebView);
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?