【发布时间】:2010-12-28 18:36:30
【问题描述】:
这是我第一次尝试这个。有人可以分享一些代码来帮助我做到这一点。
任何帮助将不胜感激。
初步尝试
你好,
我正在尝试编写通过 https 进行客户端-服务器通信的代码。
我所做的代码 sn-p(主要来自不同的论坛)如下:
_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 implementation not found W/System.err(358): at 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(本机方法)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):在 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): 在 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.ma in(ZygoteInit.java:626) W/System.err(387): at dalvik.system.NativeStart.main(Native Method)
这可能是因为我将 jks 密钥库和信任库文件保存在我的应用程序的 /res/raw 文件夹下。(只是猜测)。
请告诉我如何生成 BKS 密钥库和信任库文件。
或者我可以尝试使此代码 sn-p 工作的任何其他方式。谢谢!!
【问题讨论】:
-
表明你已经付出了一些努力,并提出更具体的要求。你有什么经验,你想做什么?
-
嗨,Markus,以上是我正在尝试的初始版本。我在 SSL 通信方面没有任何经验。