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

时间:2010-12-28 18:36:31

标签: android ssl

这是我第一次尝试这个。有人可以分享一些有助于我这样做的代码。

任何帮助都将不胜感激。

初始尝试

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

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

_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());

}

同样在主要活动中,上面的代码是:

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):at java.security.KeyStore.getInstance(KeyStore.java:134)W / System .err(358):at com.msi.getwebpage.GetWebPage $ 2.onClick(GetWebPage.java:93)W / System.err(358):at 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):at java.lang.reflect.Method.invokeNative(Native Method)W / System.err(358) ):at java.lang.reflect.Method.invoke(Method.java:521)W / System.err(358):at 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:密钥库的错误版本。 W / System.err(387):at org.bouncycastle.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:839)W / System.err(387):at java.security.KeyStore.load(KeyStore.java: 676)W / System.err(387):at com.msi.getwebpage.GetWebPage $ 2.onClick(GetWebPage.java:96)W / System.err(387):at 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):at java.lang.reflect.Method.invokeNative(Native Method)W / System.err(387):at java.lang.reflect.Method.invoke(Method.java:521)W / System.err(387):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit。 java:868)W / System.err(387):at com.android.internal.os.ZygoteInit.ma in(ZygoteInit.java:626)W / System.err(387):at dalvik.system.NativeStart.main(Native Method)

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

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

或者是他们可以尝试使这段代码片段工作的任何其他方式。谢谢!

1 个答案:

答案 0 :(得分:0)

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