我正在使用Retrofit2
与RxJava2
和OkHttp3
对内部服务器进行HTTPS
调用以测试SSL
证书,但我始终得到一个例外陈述:
HTTP FAILED: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
根据Google developer documentation,有三个原因导致这种情况发生(未知CA,自签名证书或服务器配置缺少中间CA)
我无法发布网址,因为它是内部测试服务器,但是在我的计算机上的浏览器中打开网址或在Chrome中的手机上打开网址工作正常,这是我从证书中看到的:
因此我认为它不能是选项1,因为浏览器识别证书,只有我的应用程序和OkHttp似乎不是这样,因为它没有自签名证书,选项2也不应该是原因
这就是我的OkHttp
客户端由Dagger
提供的方式:
@Provides
@PerApplication
OkHttpClient provideOkHttpClient(@ApplicationContext Context context) {
int cacheSize = 10 * 1024 * 1024; // 10 MiB
File cacheDirectory = new File(context.getCacheDir().getAbsolutePath(), "HttpCache");
ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
.build();
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder()
.connectionSpecs(Collections.singletonList(spec))
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.cache(new Cache(cacheDirectory, cacheSize));
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClientBuilder.addInterceptor(loggingInterceptor);
}
return httpClientBuilder.build();
}
我添加CollectionSpec
来定义我正在使用TLS 1.2,但这没有区别,我仍然收到Trust锚定错误。
为了使用ssl证书,还需要设置其他内容吗?任何想法为什么不接受证书?
答案 0 :(得分:0)
问题解决了,服务器的URL不正确。