【问题标题】:Retrofit failed response callback, java.security.cert.CertificateException改造失败响应回调,java.security.cert.CertificateException
【发布时间】:2015-09-02 21:46:23
【问题描述】:

我正在尝试使用 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();

                    }
                });

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

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

一些注意事项: 我之前使用过 OkHTTP 和启用了 SSL 的 API,而且我从来不需要处理证书。另外,我注意到,如果我访问 Nexus 5 上的 API 端点,我会得到:http://i.imgur.com/he8821o.png。也许这与问题有关?

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

【问题讨论】:

    标签: android ssl retrofit


    【解决方案1】:

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

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

    你可以做什么:

    1. 在您的设备中手动添加证书 - 如果您将其部署给很多人,则不好。
    2. 创建一个接受此服务器证书的自定义SslSocketFactory

    第二种方法是最好的,但它会带来很多问题。

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

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

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

    【讨论】:

    • 没错。我可以在我的电脑上正常访问端点,但在移动设备上我得到了那个错误。我不确定这部分是什么意思:“另一种方法是找出谁是此服务器证书的证书颁发机构并添加它(它适用于 #1 和 #2)。”你能详细说明一下吗?此外,在您链接的示例中,他们正在使用他们机器上的证书文件。我没有这个 API,如何获得证书?编辑:另外,它相当奇怪的 RapidSSL 默认情况下不受信任……它是获取 SSL 的最受欢迎的资源之一……
    • 对于您的两个问题。 1) SSL 身份验证适用于多个级别。您拥有服务器证书本身以及颁发它的人。如果您检查颁发者的证书,您可能还会找到颁发者的证书,从而创建证书链。服务器中的证书可能每 3 个月更改一次,但颁发者可能会持续更长时间。 Android 验证证书的做法是持有世界上最受信任的颁发者的证书,并通过证书链进行导航以对其进行测试。 2) 您可以使用以下命令获取 .cert 文件:superuser.com/questions/97201
    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 2023-03-14
    • 2016-03-05
    • 2020-02-09
    • 2021-06-21
    • 2021-11-22
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多