Модернизация - ненадежная цепь даже с доверенным сертификатом - PullRequest
0 голосов
/ 19 февраля 2020

Я (к сожалению) кладу руки на плохо написанное старое приложение 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 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...