java - 适用于 Java 的 Google Http 客户端 : Ignore java. security.cert.CertPathValidatorException:未找到证书路径的信任 anchor

标签 java android ssl

我正在使用Google's HTTP Client for Java在我的 Android 应用程序中。在我们进行 QA 测试时,我的服务器暂时使用自签名证书。当我们发布时,我们将拥有一个正确签名的证书,但现在我只需要忽略...

CertPathValidatorException: Trust anchor for certification path not found.

...错误消息并告诉 API 继续处理 http 请求/响应。

我在 Google 文档中找不到任何可以禁用此检查的内容。我发现了一些关于其他 API 的 Stack Overflow 帖子,但没有找到关于 Google HTTP 客户端的帖子。

import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.UrlEncodedContent;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.JsonObjectParser;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.Maps;
import com.google.api.client.util.escape.CharEscapers;

...

static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
HttpRequestFactory requestFactory =
                HTTP_TRANSPORT.createRequestFactory(new HttpRequestInitializer() {
                    @Override
                    public void initialize(HttpRequest request) {
                        request.setParser(new JsonObjectParser(JSON_FACTORY));
                        request.setConnectTimeout(defaultTimeoutSeconds()*1000);
                        request.setReadTimeout(defaultTimeoutSeconds()*1000);
                    }
                });

最佳答案

我花了一些时间在 Google 的 HttpTransport 的 javadoc 中爬行并间接找到了答案。

Google 提供了两种 HttpTransport 实现:NetHttpTransport 和 ApacheHttpTransport。前者使用 Java 的基本 HttpURLConnection 来完成所有通信,是首选。后者在幕后使用 Apache httpclient,Google HttpTransport 文档表示,如果您需要基本 NetHttpTransport 中不可用的高级配置参数,请使用 Apache。

不要像这样初始化我的传输常量:

static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

我正在使用 ApacheHttpTransport Builder,它提供了跳过证书验证的选项。

... new ApacheHttpTransport.Builder().doNotValidateCertificate().build();

注意:对于以后得出这个答案的人来说,这是一个坏主意。我仅在受控的 QA 环境中进行此操作,并且在我们获得正确签名的 SSL 证书的短时间内进行此操作。一旦我们的签名证书就位,我将返回到上面的原始代码,并要求我的应用程序的所有 api 通信都需要正确签名的证书。

请勿在生产代码中执行此操作。 :)

关于java - 适用于 Java 的 Google Http 客户端 : Ignore java. security.cert.CertPathValidatorException:未找到证书路径的信任 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45971094/

相关文章:

java - 在 ADF 页面刷新中

java - 当列移动时,如何同步两个 JTable 和 JTableHeader?

java - 为什么输出中有负数?

java - 对象列表设计模式的接口(interface)?

android - Android 示例中的图像矫正

android - CoordinatorLayout 用 subview 折叠 LinearLayout

delphi - Synapse Delphi HTTPS SSL GET 请求

Android:我的应用程序突然崩溃

ruby - 在 Ruby 中关闭 SSL 证书验证

php - 我应该如何从我网站上 2 个人之间的交易中扣款?