终于我解决了https问题。当我与之抗争时,主要问题在于服务器,尤其是证书。Android仅支持“
BKS”证书,这就是我们无法从服务器获得响应的原因。为了解决这个问题,我阅读了30多篇文章,最后找到了解决方案。
您可以在下面看到我为解决此问题而执行的步骤:
我要做的第一件事是从我们的fidoserver.crt证书生成.bks密钥库文件,为了做到这一点,我已阅读本文,并执行以下操作:
- 打开cmd
- 转到JDK文件夹“ cd X: Programs Java Jdk6 bin”
- 调用以下命令:
keytool-导入-alias tomcat-文件X://KeyStore/fidoserver.crt -keypass密码-keystore
X://KeyStore/keystore.bks -storetype BKS -storepass 222222 -providerClass
org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath
X://KeyStore/bcprov-jdk16-146.jar
在运行此命令之前,我已经下载了Bouncy
Castle
.jar文件,并将其放入带有证书的文件夹中。完成所有步骤后,我将获得keystore.bks文件,该文件是适用于Android应用程序的正确证书文件。我将此文件放在Android的mnc
/ sdcard文件夹中。在Java代码中,我编写了以下代码来读取keystore.bbk文件
KeyStore trustStore = KeyStore.getInstance( "BKS" );FileInputStream instream = new FileInputStream(new File("/mnt/sdcard/keystore.bks"));try { trustStore.load(instream, "222222".toCharArray());} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (CertificateException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();} finally { try { instream.close(); } catch (Exception ignore) {}}// Create socket factory with given keystore.SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);Scheme sch = new Scheme("https", socketFactory, 443);httpclient.getConnectionManager().getSchemeRegistry().register(sch);HttpGet httpget = new HttpGet("https://10.2.20.20/fido/EzPay/login.php");System.out.println("executing request " + httpget.getRequestLine());HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();System.out.println("----------------------------------------");System.out.println(response.getStatusLine());if (entity != null) { System.out.println("Response content length: " + entity.getContentLength());}// Print html.BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));String line = "";while ((line = in.readLine()) != null) { System.out.println(line);}in.close();所有这些使m可以使用给定的密码222222(使用keytool创建密钥库时提供的密码)加载我们的证书。
在这之后,我所有的测试应用程序开始正常工作。现在,我可以向https发送请求并从中获取响应。我已经使用FIDO服务器测试了应用程序,一切正常!我认为星期一我将在EzPay应用程序中进行一些更改,并且它将开始使用https连接。
参考文献
- 在Apache Tomcat和Android上使用TLS
- Android应用程序的SSL验证
- 密钥库
- Android:信任SSL证书
- 充气城堡



