改造失败的响应回调,java.security.cert.CertificateException

时间:2015-09-02 21:46:23

标签: android ssl retrofit

我尝试使用Retrofit来调用此api:https://api.wheretheiss.at/v1/satellites/25544

以下是建立连接的代码:

retrieveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(BASEURL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                ISSApi api = retrofit.create(ISSApi.class);

                Call<ISS> ISS = api.getLocation();

                ISS.enqueue(new Callback<ISS>() {
                    @Override
                    public void onResponse(Response<ISS> response) {
                        System.out.println("booya");
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        System.out.println("failure");
                        System.out.println(t.getMessage().toString());
                        t.printStackTrace();

                    }
                });

所以它似乎至少能够找到API,因为onFailure回调被触发,但是我得到了这个错误:

  

javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。

一些说明: 之前我使用过具有SSL功能的API的OkHTTP,我从来没有处理过证书。此外,我注意到,如果我去Nexus 5上的API端点,我得到这个:http://i.imgur.com/he8821o.png。也许这与问题有关?

任何帮助表示赞赏。使用Retrofit 2.0.0。

1 个答案:

答案 0 :(得分:1)

您尝试连接的服务器没有适用于Android的有效SSL证书。

这很奇怪,因为我可以在我的计算机上访问它而没有任何问题,但显然 Android缺少签署此证书的CA

你能做什么:

  1. 在您的设备中手动添加证书 - 如果您要将证书部署到许多人身上,那就太好了。
  2. 创建一个接受此服务器证书的自定义SslSocketFactory
  3. 第二种方法是最好的,但它带来了很多问题。

    例如,如果服务器更改了证书(它们通常会不时更改),则每次更新应用程序时都会收到相同的错误。 另一种方法是找到谁是此服务器证书的证书颁发机构,然后添加它(它适用于#1和#2)。

    检查this answer以了解如何使用OkHttp覆盖证书验证。

    编辑:证书颁发者似乎 RapidSSL (信息here)。