【发布时间】:2014-07-18 17:02:54
【问题描述】:
我有以下代码用于配置和 SSL 连接并使用 Jsonrpc4j 实现实例化 JsonRpcHttpClient:
public static void createJsonRpcClient(Context ctx) throws NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException, KeyManagementException {
if(instance==null) {
//http://stackoverflow.com/questions/7615645
Properties props=System.getProperties();
props.put("jsse.enableSNIExtension", "false");
//Configurando la conexion SSL
SSLContext sc=SSLContext.getInstance("TLS");
KeyStore ks = KeyStore.getInstance("PKCS12");
AssetManager manager=ctx.getAssets();
ks.load(manager.open("www.example.com.p12"),
"Password".toCharArray());
TrustManagerFactory tf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tf.init(ks);
sc.init(null, tf.getTrustManagers(), null);
//Configurando la autenticacion HTTP
Authenticator auth=new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user",
"pass".toCharArray());
}
};
Authenticator.setDefault(auth);
instance=new JsonRpcHttpClient(new URL("https://www.example.com/" +
"dbconnector/index.php"));
instance.setSslContext(sc);
}
}
/**
*
* @return La instancia del cliente JSON-RPC
*/
public static JsonRpcHttpClient getJsonRpcClient() {
return instance;
}
这种代码格式很糟糕,我不知道为什么......无论如何,这段代码在 Android 4.2 上运行良好,以下 JSON-RPC 请求运行良好
然而,在 Android 2.2 上,即使在我尝试执行 JSON-RPC 请求时代码没有引发任何异常,也会引发此异常:
07-18 16:00:06.433: W/System.err(391): Expetion: Not trusted server certificate
07-18 16:00:06.493: W/System.err(391): javax.net.ssl.SSLException: Not trusted server certificate
07-18 16:00:06.493: W/System.err(391): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
07-18 16:00:06.623: W/System.err(391): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.getSecureSocket(HttpConnection.java:168)
07-18 16:00:06.643: W/System.err(391): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:399)
07-18 16:00:06.653: W/System.err(391): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:147)
07-18 16:00:06.773: W/System.err(391): at com.googlecode.jsonrpc4j.JsonRpcHttpClient.invoke(JsonRpcHttpClient.java:145)
07-18 16:00:06.832: W/System.err(391): at com.googlecode.jsonrpc4j.JsonRpcHttpClient.invoke(JsonRpcHttpClient.java:105)
07-18 16:00:06.832: W/System.err(391): at com.googlecode.jsonrpc4j.JsonRpcHttpClient.invoke(JsonRpcHttpClient.java:123)
07-18 16:00:06.842: W/System.err(391): at com.example.app.JsonRpcTask.doInBackground(JsonRpcTask.java:40)
最后一行提到的JsonRpcTask 是一个AsyncTask,它检索之前实例化的JsonRpcHttpClient 并发送我传递给它的JSON-RPC 调用。
由于它不是NullPointerException,这意味着该实例已正确启动,但是似乎由于某种原因而忽略了受信任的证书。
PD:请帮我解决 SO 格式问题,这是一团糟……我认为 WYSIWYG 编辑器会很棒
【问题讨论】:
标签: java android ssl certificate json-rpc