Я (к сожалению) кладу руки на плохо написанное старое приложение Android, оно использовало HTTP
WebService, который теперь переведен на HTTPS
, подписанный доверенным сертификатом DigiCert (я проверил его действительность на https://www.digicert.com/help/).
Для моего душевного равновесия я представил в проекте Retrofit с RxJava2 для выполнения вызовов WebService, я использую копию-вставку для других проектов и всегда работает, поэтому я думаю, что проблема не в моем коде
private HttpManager(Context context, String baseUrl) {
this.context = context;
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
Gson gson = new GsonBuilder()
.setLenient()
.create();
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
.addInterceptor(chain -> {
Request.Builder builder1 = chain.request().newBuilder();
builder1.header("Content-Type", "application/json");
return chain.proceed(builder1.build());
})
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS);
OkHttpClient client = builder.build();
if (BuildConfig.DEBUG){
LoggingInterceptor loggingInterceptor = new LoggingInterceptor.Builder()
.loggable(true)
.request()
.requestTag("Request")
.response()
.responseTag("Response")
.build();
builder.addInterceptor(loggingInterceptor);
}
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build();
}
здесь есть одна конечная точка, довольно просто
@POST("sync/login_user.php")
Single<LoginResponseModel> login(@Body LoginRequestModel requestModel);
и вот как я начинаю вызов
disposable.add(
httpManager.service().create(LoginService.class).login(loginRequestModel)
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(disposable1 -> {
// do things
})
.doOnError(throwable -> {
onLoginError(throwable);
})
.flatMapCompletable(responseModel -> Completable.fromAction(() -> {
onLoginComplete(responseModel);
}))
.doFinally(() -> {
// do things
})
.subscribe(() -> {}, e -> {})
);
Это приводит к следующей ошибке
------------------Untrusted chain: ----------------------
== Chain0 ==
AuthorityKeyIdentifier: skdjfgsldf
SubjectKeyIdentifier: slkfdjhsldfg
Serial Number: 0r9c2yr
SubjectDN: CN=*.url.com, OU=web site, O=NOT GONNA SAY THAT, L=Nope , C=IT
IssuerDN: CN=GeoTrust RSA CA 2018, OU=www.digicert.com, O=DigiCert Inc, C=US
Get not before: Thu Nov 07 01:00:00 GMT+01:00 2019
Get not after: Fri Nov 06 13:00:00 GMT+01:00 2020
Sig ALG name: SHA256withRSA
Signature: blablabla
Public key: 71 92 fd 46 a9 d4 // and so on...
Я не могу объяснить, что весь приведенный выше код работает с API-интерфейсами StackExchange (в https
) в проекте, но не работает с нужной конечной точкой я могу правильно связаться с сервером в Интернете (Chrome, который говорит, что у него есть действительный сертификат), с почтальоном, с CURL, ни одной проблемы.
Примечание : используется Java, но Kotlin также допускается * 10 25 *