CertPathValidatorException:找不到证书路径的信任锚
Posted
技术标签:
【中文标题】CertPathValidatorException:找不到证书路径的信任锚【英文标题】:CertPathValidatorException: Trust anchor for certification path not found 【发布时间】:2017-10-03 11:45:27 【问题描述】:我在OKHTTPClient中添加了HTTPPinning,示例代码为:
OkHttpClient client = new OkHttpClient();
client.setSslSocketFactory(getPinnedCertSslSocketFactory(context));
private SSLSocketFactory getPinnedCertSslSocketFactory(Context context)
try
KeyStore trusted = KeyStore.getInstance("BKS");
InputStream incontext.getResources().openRawResource(R.raw.prod_keystore);
trusted.load(in, "venkat@123".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trusted);
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
return sslContext.getSocketFactory();
catch (Exception e)
Log.e("MyApp", e.getMessage(), e);
return null;
我将应用程序上传到 Playstore,从过去 1 年开始,它运行良好。但从过去 1 周开始,它给出了以下问题,我使用了版本 com.squareup.okhttp:okhttp:2.7.4
的 OkHttpjava.security.cert.CertPathValidatorException: Trust anchor for certification path not found. javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357) at com.squareup.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:192) at com.squareup.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:149) at com.squareup.okhttp.internal.io.RealConnection.connect(RealConnection.java:112) at com.squareup.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184) at com.squareup.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126) at com.squareup.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95) at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281) at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224) at com.squareup.okhttp.Call.getResponse(Call.java:286) at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243) at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205) at com.squareup.okhttp.Call.execute(Call.java:80) at com.venkat.good.http.MyHTTPThread.run(MyHTTPThread.java:492) at com.venkat.good.http.MyHTTPThread.run(MyHTTPThread.java:76) at java.lang.Thread.run(Thread.java:818)
通过使用 OKHTTP3 我解决了这个问题。
String hostname = "yourdomain.com";
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build();
OkHttpClient client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build();
Request request = new Request.Builder()
.url("https://" + hostname)
.build();
client.newCall(request).execute();
但我想知道为什么以前的 OkHttp2 版本可以运行几天,然后又会出现问题?
【问题讨论】:
服务器端是否有变化或证书过期? 我在创建 BKS 文件时没有指定任何日期,服务器人员也没有更改任何内容。 【参考方案1】:迟到总比不到好
很高兴您通过 OkHttp3
解决了您的问题。
让我回答你提出的子问题:
这是一个构建系统配置问题,不是OkHttp
的问题。
每个人都惊讶地看到这样的行为,因为它应该是
解决OkHttp3
要求使用的更高版本。
如果您使用的是 maven
或 retrofit
,则已将修复程序合并到较新的版本中(OkHttp3
为上述库实现了它)。
【讨论】:
以上是关于CertPathValidatorException:找不到证书路径的信任锚的主要内容,如果未能解决你的问题,请参考以下文章