android - 在 android 中使用 xml 通过 https 进行客户端服务器通信

标签 android ssl

这是我第一次尝试这个。有人可以分享一些代码来帮助我做到这一点。

如有任何帮助,我们将不胜感激。

初始尝试

你好,

我正在尝试编写将通过 https 进行客户端-服务器通信的代码。

我所做的代码 fragment (主要来自不同的论坛)如下:

_FakeX509TrustManager.allowAllSSL();

allowAllSSL() 的代码是

public static void allowAllSSL() { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

            public boolean verify(String hostname, SSLSession session) {
                // TODO Auto-generated method stub
                return false;
            }

    });

    SSLContext context = null;
    if (trustManagers == null) {
            trustManagers = new TrustManager[] { new _FakeX509TrustManager() };
    }

    try {
            context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
    } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
    } catch (KeyManagementException e) {
            e.printStackTrace();
    }

    HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

同样在主 Activity 中,上面之后的代码是:

HttpPost post = new HttpPost(new URI(eText.getText().toString())); post.setEntity(new StringEntity("test"));

            KeyStore trustStore = KeyStore.getInstance("JKS");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            InputStream trustStoreStream = getBaseContext().getResources().openRawResource(R.raw.mytruststore);
            trustStore.load(trustStoreStream, "test1234".toCharArray());
            trustManagerFactory.init(trustStore);

            // Setup keystore
            KeyStore keyStore = KeyStore.getInstance("JKS");
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            InputStream keyStoreStream = getBaseContext().getResources().openRawResource(R.raw.mykeystore);
            keyStore.load(keyStoreStream, "test1234".toCharArray());
            keyManagerFactory.init(keyStore, "test1234".toCharArray());

            SSLSocketFactory sslf = new SSLSocketFactory(keyStore);
            sslf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(new Scheme ("https", sslf, 443));
            SingleClientConnManager cm = new
            SingleClientConnManager(post.getParams(), schemeRegistry);

            HttpClient client = new DefaultHttpClient(cm, post.getParams());
            HttpResponse result = client.execute(post); 

我已经生成了 JKS Keystore 和 Truststore 文件,并将其保存在我的应用程序的/res/raw 文件夹下。

我在这里得到的错误是:

W/System.err(358):java.security.KeyStoreException:未找到 KeyStore JKS 实现 W/System.err(358):在 java.security.KeyStore.getInstance(KeyStore.java:134)W/System .err(358): 在 com.msi.getwebpage.GetWebPage$2.onClick(GetWebPage.java:93) W/System.err(358): 在 android.view.View.performClick(View.java:2408) W/System.err(358):在 android.view.View$PerformClick.run(View.java:8816) W/System.err(358):在 android.os.Handler.handleCallback(Handler.java:587) W/System.err(358):在 android.os.Handler.dispatchMessage(Handler.java:92) W/System.err(358):在 android.os.Looper.loop(Looper.java:123) W/System.错误(358):在 android.app.ActivityThread.main(ActivityThread.java:4627)W/System.err(358):在 java.lang.reflect.Method.invokeNative( native 方法)W/System.err(358) ): 在 java.lang.reflect.Method.invoke(Method.java:521) W/System.err( 358): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) W/System.err(358): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) W/System.err(358): at dalvik.system.NativeStart.main(Native Method)

知道为什么我会收到此错误吗?

此外,如果我尝试将 KeyStore 实例更改为 BKS,我会收到如下错误:

W/System.err( 387): java.io.IOException: keystore 版本错误。 W/System.err(387):在 org.bouncycaSTLe.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:839) W/System.err(387):在 java.security.KeyStore.load(KeyStore.java: 676)W/System.err(387):在 com.msi.getwebpage.GetWebPage$2.onClick(GetWebPage.java:96)W/System.err(387):在 android.view.View.performClick(View.java :2408) W/System.err(387): 在 android.view.View$PerformClick.run(View.java:8816) W/System.err(387): 在 android.os.Handler.handleCallback(Handler.java :587)W/System.err(387):在android.os.Handler.dispatchMessage(Handler.java:92)W/System.err(387):在android.os.Looper.loop(Looper.java:123 ) W/System.err(387): 在 android.app.ActivityThread.main(ActivityThread.java:4627) W/System.err(387): 在 java.lang.reflect.Method.invokeNative(Native Method) W/System.err(387):在 java.lang.reflect.Method.invoke(Method.java:521) W/System.err(387):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java:868) W/System.err(387): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) W/System.err(387): 在 dalvik.system.NativeStart.main( native 方法)

这可能是因为我将 jks keystore 和信任库文件保存在我的应用程序的/res/raw 文件夹下。(只是猜测)。

请告诉我如何生成 BKS keystore 和信任库文件。

或者我可以尝试使用其他任何方式使此代码 fragment 正常工作。谢谢!!

最佳答案

简短的回答是:使用 keytool(来自 Java SDK)从您的 jks keystore 导出证书,然后使用 bouncycaSTLe 安全提供程序将它们导入到新的 BKS keystore 。

关于android - 在 android 中使用 xml 通过 https 进行客户端服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4548449/

相关文章:

ios - 为什么我的服务器的通配符 SSL 证书被拒绝?

android - 如何删除cloudinary镜像到Android端?

java - android中如何等待线程完成

android - 在android中的位图中腾出更多空间

c++ - 将 QSslSocket 与 OpenSSL 服务器连接

android - 使用 JQuery 和 PhoneGap 时的 SSL 查询

python - 线程中的 SSL 错误与 python 中的简单发布请求

javascript - Appcelerator TableView > 行 > 文本字段 > 值

java - 捕获音频并将其可视化 Android

java - 使用自签名证书在 Android 上创建 SSL-Socket