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

Android 改装失败的响应回调,java.security.cert.CertificateException,android,ssl,retrofit,Android,Ssl,Retrofit,我正在尝试使用改装来调用此api: 以下是正在进行连接的代码: retrieveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Retrofit retrofit = new Retrofit.Builder() .baseUr

我正在尝试使用改装来调用此api:

以下是正在进行连接的代码:

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();

                    }
                });
retrieveButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
改装改装=新改装.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
ISSApi=改装.create(ISSApi.class);
调用ISS=api.getLocation();
ISS.enqueue(新回调(){
@凌驾
公共响应(响应){
System.out.println(“booya”);
}
@凌驾
失效时的公共无效(可丢弃的t){
系统输出打印项次(“失败”);
System.out.println(t.getMessage().toString());
t、 printStackTrace();
}
});
因此,在启动onFailure回调时,它似乎至少能够找到API,但我收到了以下错误:

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

一些注意事项: 我以前在启用SSL的API中使用过OkHTTP,而且我从未处理过证书。此外,我注意到,如果我在Nexus 5上访问API端点,我会得到以下信息:。也许这与问题有关


感谢您的帮助。使用改型2.0.0。

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

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

您可以做什么:

  • 在您的设备中手动添加证书——如果您要将证书部署给许多人,则不太好
  • 创建接受此服务器证书的自定义
    SslSocketFactory
  • 第二种方法是最好的,但它会带来很多问题

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

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


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

    没错。我可以在我的电脑上访问端点,但在移动设备上我发现了错误。我不确定这部分的意思:“另一种方法是查找谁是此服务器证书的证书颁发机构,然后添加它。”(它将与#1和#2一起工作)。”你能详细说明一下吗?另外,在你链接的示例中,他们正在使用他们机器上的证书文件。我没有这个API,我如何获得证书?编辑:另外,很奇怪RapidSL默认不受信任…它是获取SSL的最流行资源之一…回答你的两个问题。1)SSL身份验证可以在多个级别工作。您拥有服务器证书本身以及颁发者。如果您检查颁发者的证书,您可能会发现颁发者也是谁,从而创建一个证书链。服务器中的证书可能每3个月更改一次,但颁发者可能会持续更长时间。安卓如何验证证书用于保存世界上最受信任的颁发者的证书,并在证书链中导航以对其进行测试。2)您可以使用以下方法获取.cert文件: