【问题标题】:Android SSLContext trusted certificates Not Working on API 8Android SSLContext 可信证书不适用于 API 8
【发布时间】: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


    【解决方案1】:

    好的,我发现问题与TrustManager有关,解决方法描述here

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 1970-01-01
      • 2012-02-24
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      相关资源
      最近更新 更多