javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: якорь доверия для пути сертификации не найден

Я использую Retrofit для доступа к моему REST API. Однако, когда я помещаю свой API за ssl и получаю к нему доступ через http://myhost/myapi, я получаю эту ошибку:

Нужно ли мне делать что-то еще, когда мой API находится за SSL?

Вот как я подключаюсь:

private final String API = "https://myhost/myapi";

private final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
        .setServer(API)
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .build();

01-10 09:49:55.621    2076-2100/com.myapp.mobile D/Retrofit﹕ javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
            at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:401)
            at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
            at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
            at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
            at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
            at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
            at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
            at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
            at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
            at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222)
            at $Proxy12.signin(Native Method)
            at com.myapp.loginactivity$3.doInBackground(LoginActivity.java:143)
            at com.myapp.loginactivity$3.doInBackground(LoginActivity.java:136)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
            at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:282)
            at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202)
            at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:595)
            at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
            at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:398)
            at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
            at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
            at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
            at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
            at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
            at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
            at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
            at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
            at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222)
            at $Proxy12.signin(Native Method)
            at com.myapp.LoginActivity$3.doInBackground(LoginActivity.java:143)
            at com.myapp.LoginActivity$3.doInBackground(LoginActivity.java:136)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:841)

person birdy    schedule 10.01.2014    source источник
comment
ты решил эту проблему?   -  person Xianfeng.Cai    schedule 29.07.2014
comment
Если вы еще не решили это, см .: stackoverflow.com/a/31436459/4261176   -  person Paulo Avelar    schedule 12.11.2015


Ответы (12)


Причина, по которой это происходит, заключается в том, что JVM / Dalvik не доверяет сертификатам CA в системе или в хранилищах сертификатов пользователей.

Чтобы исправить это с помощью Retrofit, если вы используете okhttp, с другим клиентом это очень похоже.
Вам необходимо сделать:

А). Создайте хранилище сертификатов, содержащее открытый ключ CA. Для этого вам необходимо запустить следующий скрипт для * nix. Вам необходимо установить openssl на свой компьютер и загрузить с https://www.bouncycastle.org/ jar bcprov -jdk16-1.46.jar. Загрузите эту версию, а не другую, версия 1.5x не совместима с android 4.0.4.

#!/bin/bash

if [ -z $1 ]; then
  echo "Usage: cert2Android<CA cert PEM file>"
  exit 1
fi

CACERT=$1
BCJAR=bcprov-jdk16-1.46.jar

TRUSTSTORE=mytruststore.bks
ALIAS=`openssl x509 -inform PEM -subject_hash -noout -in $CACERT`

if [ -f $TRUSTSTORE ]; then
    rm $TRUSTSTORE || exit 1
fi

echo "Adding certificate to $TRUSTSTORE..."
keytool -import -v -trustcacerts -alias $ALIAS \
      -file $CACERT \
      -keystore $TRUSTSTORE -storetype BKS \
      -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \
      -providerpath $BCJAR \
      -storepass secret

echo "" 
echo "Added '$CACERT' with alias '$ALIAS' to $TRUSTSTORE..."

Б). Скопируйте файл truststore mytruststore.bks в res / raw вашего проекта truststore location

C). Установка SSLContext соединения:

.............
okHttpClient = new OkHttpClient();
try {
    KeyStore ksTrust = KeyStore.getInstance("BKS");
    InputStream instream = context.getResources().openRawResource(R.raw.mytruststore);
    ksTrust.load(instream, "secret".toCharArray());

    // TrustManager decides which certificate authorities to use.
    TrustManagerFactory tmf = TrustManagerFactory
        .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ksTrust);
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, tmf.getTrustManagers(), null);

    okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
} catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | KeyManagementException e) {
    e.printStackTrace();
}
.................
person Fernando.    schedule 28.02.2015
comment
Если вы используете retrofit, вам необходимо прикрепить этот OkHttpClient, как предлагается здесь: github.com/square/retrofit / issues / 265. Также я обнаружил, что это работает только с: bcprov-jdk16-1.46.jar, иначе вы получите wrong version of keystore error - person stephen; 17.03.2015
comment
Невозможно разрешить метод okHttpClient.setSslSocketFactory(..), теперь должно быть client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory()).build(); - person G. Ciardini; 25.06.2019
comment
@Fernando, можете ли вы помочь с серверной частью, какой сертификат использовать там, может быть, он будет таким же? \ - person inrob; 08.03.2020

Это может произойти по нескольким причинам, в том числе:

  1. ЦС, выдавший сертификат сервера, был неизвестен.
  2. Сертификат сервера не был подписан центром сертификации, но был самоподписанным.
  3. В конфигурации сервера отсутствует промежуточный ЦС

пожалуйста, проверьте эту ссылку для решения: https://developer.android.com/training/articles/security-ssl.html#CommonProblems

person Defuera    schedule 26.02.2015
comment
Да, я к тому времени использовал retrofit + okhttp - person Defuera; 25.10.2015
comment
У меня была такая же проблема, проблема была в пункте 3: в конфигурации сервера отсутствует промежуточный ЦС, добавление промежуточного ЦС решило проблему - person Carlos B. Flores; 11.04.2019

Исправление для Android N и выше. У меня была аналогичная проблема, и мне удалось ее решить, выполнив шаги, описанные в https://developer.android.com/training/articles/security-config.

Но изменения конфигурации без какой-либо сложной логики кода будут работать только на Android версии 24 и выше.

Исправление для всех версий, включая версию ‹N: Итак, для Android ниже N (версия 24) решение заключается в изменении кода, как указано выше. Если вы используете OkHttp, следуйте customTrust: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java

person vijay    schedule 09.04.2020

Привет, та же проблема, которую я решил, вы можете попробовать это

java.security.cert.CertPathValidatorException: якорь доверия для пути сертификации не найдено. СЕТЬ

 // SET SSL
public static OkClient setSSLFactoryForClient(OkHttpClient client) {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();


        client.setSslSocketFactory(sslSocketFactory);
        client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return new OkClient(client);
}
person sushant gosavi    schedule 19.08.2016
comment
помните, что это отключает проверку сертификата. избегайте этого в производственной среде! - person logoff; 08.11.2016
comment
Это не работает с ОС ниже 5.0, TLS не включен по умолчанию на устройствах ниже 5.0 - person Harsh Bhavsar; 07.08.2018
comment
Не делайте этого, иначе вы подвергнете свое приложение атакам MitM. Никогда не следует доверять сертификатам, которых вы не знаете. - person Alexander Haroldo da Rocha; 07.02.2019
comment
Я получаю ту же ошибку, но может ли кто-нибудь мне помочь - person Vishwa Pratap; 28.02.2019
comment
@VishwaPratap получить надлежащие сертификаты от органа и использовать эти сертификаты для подключения, этот код обходит проверку сертификатов, но я предлагаю использовать сертификаты - person sushant gosavi; 01.03.2019

Я знаю 4 способа:

  • импортируйте сертификат в свое приложение и используйте его для подключения
  • отключить проверку сертификатов
  • добавьте свой сертификат в список доверенных системных сертификатов в Android
  • купить проверенный сертификат, принятый Android

Я предполагаю, что вы не хотите платить за это, поэтому я думаю, что самое элегантное решение - первое, что можно сделать таким образом:

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

person kupsef    schedule 10.01.2014
comment
Как я мог просто отключить проверку сертификатов? Желая сделать это только в тестовой среде. - person theblang; 14.08.2014
comment
Как добавить свой сертификат в список доверенных системных сертификатов в Android? - person IgorGanapolsky; 19.02.2015
comment
В Интернете есть несколько руководств по этому поводу. Вот вам один: guyrutenberg.com/2013/03/16/ - person kupsef; 21.02.2015

После некоторого исследования я нашел способ обойти ошибку ssl. Якорь доверия для пути сертификации не найден. Это может быть не лучшим способом, но вы можете использовать его в целях тестирования.

 private HttpsURLConnection httpsUrlConnection( URL urlDownload) throws Exception {
  HttpsURLConnection connection=null;
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @SuppressLint("TrustAllX509TrustManager")
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            @SuppressLint("TrustAllX509TrustManager")
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };
        SSLContext sc = SSLContext.getInstance("SSL"); // Add in try catch block if you get error.
        sc.init(null, trustAllCerts, new java.security.SecureRandom()); // Add in try catch block if you get error.
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        HostnameVerifier usnoHostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        SSLSocketFactory sslSocketFactory = sc.getSocketFactory();

        connection = (HttpsURLConnection) urlDownload.openConnection();
        connection.setHostnameVerifier(usnoHostnameVerifier);
        connection.setSSLSocketFactory(sslSocketFactory);

        return connection;
    }
person amit semwal    schedule 02.11.2020

В основном у вас есть четыре потенциальных решения для устранения исключения javax.net.ssl.SSLHandshakeException: exception на Android.

  1. Доверяйте всем сертификатам. Не делайте этого, если вы действительно не знаете, что делаете.
  2. Создайте собственный SSLSocketFactory, который доверяет только вашему сертификату. Это работает до тех пор, пока вы точно знаете, к каким серверам собираетесь подключиться, но как только вам потребуется подключиться к новому серверу с другим сертификатом SSL, вам нужно будет обновить свое приложение.
  3. Создайте файл хранилища ключей, содержащий основной список сертификатов Android, а затем добавьте свой собственный. Если в будущем срок действия любого из этих сертификатов истечет, вы несете ответственность за их обновление в своем приложении. Я не могу придумать причины для этого.
  4. Создайте настраиваемый SSLSocketFactory, который использует встроенный сертификат KeyStore, но использует альтернативное KeyStore для всего, что не удается проверить с использованием по умолчанию. Это хорошо объясняется в щелкните здесь

Кроме того, я хочу более подробно остановиться на пункте номер 1. Мы можем выборочно пропустить какой-либо домен, используя конфигурацию сети манифеста, как объяснено:

  1. Создайте файл network_security_config.xml в папке xml в папке res со следующим содержимым.

       <network-security-config xmlns:tools="http://schemas.android.com/tools"
         xmlns:android="http://schemas.android.com/apk/res/android">
             <domain-config>
              <domain includeSubdomains="true">191.1.1.0</domain>
              <domain includeSubdomains="true">your_domain</domain>
             <trust-anchors>
                 <certificates src="system" />
                 <certificates src="user" />
             </trust-anchors>
         </domain-config>
     </network-security-config>
    
  2. Добавьте network_security_config.xml в тег приложения в манифесте как:

    android:networkSecurityConfig="@xml/network_security_config"

Вот оно .. сделано !!. Вы успешно пропустили сертификат SSL.

person taranjeetsapra    schedule 02.12.2020

SSL не настроен должным образом. Эти ошибки trustAnchor обычно означают, что хранилище доверенных сертификатов не может быть найдено. Проверьте свою конфигурацию и убедитесь, что вы действительно указываете на хранилище доверенных сертификатов и что оно существует.

Убедитесь, что у вас установлено системное свойство -Djavax.net.ssl.trustStore, а затем убедитесь, что путь действительно ведет к хранилищу доверенных сертификатов.

Вы также можете включить отладку SSL, установив это системное свойство -Djavax.net.debug=all. В выводе отладки вы заметите, что он не может найти хранилище доверенных сертификатов.

person Kevin Bowersox    schedule 10.01.2014
comment
Означает, что одноранговый сертификат не был найден в хранилище доверенных сертификатов, которое было найдено. - person user207421; 09.07.2016

Я использую этот класс и у меня нет проблем.

public class WCFs
{
    // https://192.168.30.8/myservice.svc?wsdl
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "192.168.30.8";
    private static final String SERVICE = "/myservice.svc?wsdl";
    private static String SOAP_ACTION = "http://tempuri.org/iWCFserviceMe/";


    public static Thread myMethod(Runnable rp)
    {
        String METHOD_NAME = "myMethod";

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        request.addProperty("Message", "Https WCF Running...");
        return _call(rp,METHOD_NAME, request);
    }

    protected static HandlerThread _call(final RunProcess rp,final String METHOD_NAME, SoapObject soapReq)
    {
        final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        int TimeOut = 5*1000;

        envelope.dotNet = true;
        envelope.bodyOut = soapReq;
        envelope.setOutputSoapObject(soapReq);

        final HttpsTransportSE httpTransport_net = new HttpsTransportSE(URL, 443, SERVICE, TimeOut);

        try
        {
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() // use this section if crt file is handmake
            {
                @Override
                public boolean verify(String hostname, SSLSession session)
                {
                    return true;
                }
            });

            KeyStore k = getFromRaw(R.raw.key, "PKCS12", "password");
            ((HttpsServiceConnectionSE) httpTransport_net.getServiceConnection()).setSSLSocketFactory(getSSLSocketFactory(k, "SSL"));


        }
        catch(Exception e){}

        HandlerThread thread = new HandlerThread("wcfTd"+ Generator.getRandomNumber())
        {
            @Override
            public void run()
            {
                Handler h = new Handler(Looper.getMainLooper());
                Object response = null;

                for(int i=0; i<4; i++)
                {
                    response = send(envelope, httpTransport_net , METHOD_NAME, null);

                    try
                    {if(Thread.currentThread().isInterrupted()) return;}catch(Exception e){}

                    if(response != null)
                        break;

                    ThreadHelper.threadSleep(250);
                }

                if(response != null)
                {
                    if(rp != null)
                    {
                        rp.setArguments(response.toString());
                        h.post(rp);
                    }
                }
                else
                {
                    if(Thread.currentThread().isInterrupted())
                        return;

                    if(rp != null)
                    {
                        rp.setExceptionState(true);
                        h.post(rp);
                    }
                }

                ThreadHelper.stopThread(this);
            }
        };

        thread.start();

        return thread;
    }


    private static Object send(SoapSerializationEnvelope envelope, HttpTransportSE androidHttpTransport, String METHOD_NAME, List<HeaderProperty> headerList)
    {
        try
        {
            if(headerList != null)
                androidHttpTransport.call(SOAP_ACTION + METHOD_NAME, envelope, headerList);
            else
                androidHttpTransport.call(SOAP_ACTION + METHOD_NAME, envelope);

            Object res = envelope.getResponse();

            if(res instanceof SoapPrimitive)
                return (SoapPrimitive) envelope.getResponse();
            else if(res instanceof SoapObject)
                return ((SoapObject) envelope.getResponse());
        }
        catch(Exception e)
        {}

        return null;
    }

    public static KeyStore getFromRaw(@RawRes int id, String algorithm, String filePassword)
    {
        try
        {
            InputStream inputStream = ResourceMaster.openRaw(id);
            KeyStore keystore = KeyStore.getInstance(algorithm);
            keystore.load(inputStream, filePassword.toCharArray());
            inputStream.close();

            return keystore;
        }
        catch(Exception e)
        {}

        return null;
    }

    public static SSLSocketFactory getSSLSocketFactory(KeyStore trustKey, String SSLAlgorithm)
    {
        try
        {
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(trustKey);

            SSLContext context = SSLContext.getInstance(SSLAlgorithm);//"SSL" "TLS"
            context.init(null, tmf.getTrustManagers(), null);

            return context.getSocketFactory();
        }
        catch(Exception e){}

        return null;
    }
}
person Ali Bagheri    schedule 13.05.2018

Хорошо, поэтому я столкнулся с той же проблемой для моего приложения для Android, которое имеет защищенный домен, то есть HTTPS,

Вот шаги:

  1. Вам понадобится файл сертификата SSL, то есть файл .pem для вашего домена.
  2. поместите этот файл в папку с ресурсами
  3. Просто скопируйте и вставьте этот класс в свой проект.

public class SSlUtilsw {

public static SSLContext getSslContextForCertificateFile(Context context, String fileName){

    try {
        KeyStore keyStore = SSlUtilsw.getKeyStore(context, fileName);
        SSLContext sslContext = SSLContext.getInstance("SSL");
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);
        sslContext.init(null,trustManagerFactory.getTrustManagers(),new SecureRandom());
        return sslContext;

    }catch (Exception e){
        String msg = "Error during creating SslContext for certificate from assets";
        e.printStackTrace();
        throw new RuntimeException(msg);
    }
}

public static KeyStore getKeyStore(Context context,String fileName){
    KeyStore keyStore = null;
    try {
        AssetManager assetManager=context.getAssets();
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput=assetManager.open(fileName);
        Certificate ca;
        try {
            ca=cf.generateCertificate(caInput);

        }finally {
            caInput.close();
        }
        String keyStoreType=KeyStore.getDefaultType();
        keyStore=KeyStore.getInstance(keyStoreType);
        keyStore.load(null,null);
        keyStore.setCertificateEntry("ca",ca);
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return keyStore;
}}
  1. В своем классе модернизации http-клиента добавьте это

        val trustManagerFactory: TrustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    trustManagerFactory.init(null as KeyStore?)
    val trustManagers: Array<TrustManager> = trustManagerFactory.trustManagers
    if (trustManagers.size != 1 || trustManagers[0] !is X509TrustManager) {
        throw IllegalStateException("Unexpected default trust managers:" + trustManagers.contentToString())
    }
    val trustManager = trustManagers[0] as X509TrustManager
    
    httpClient.sslSocketFactory(SSlUtils.getSslContextForCertificateFile(
            applicationContextHere, "yourcertificate.pem").socketFactory, trustManager)
    

И это все.

person Kishan Solanki    schedule 19.02.2020
comment
Привет, я успешно добавил сертификат, я все еще получаю сообщение об ошибке. Не знаю почему. Нужно ли нам что-нибудь делать на стороне API? Прошу совета прилипнуть из многих дней. CN = Cloudflare, C = США получает это, если зарегистрируйте это cf.generateCertificate(caInput);. - person RaRa; 15.10.2020

Мой ответ может не быть решением вашего вопроса, но он наверняка поможет другим, ищущим подобную проблему, подобную этой: javax.net.ssl.SSLHandshakeException: проверка цепочки не удалась

Вам просто нужно проверить дату и время вашего Android-устройства, это должно решить проблему. Это решило мою проблему.

person Muhammed Irfan    schedule 09.03.2020

Это проблема на стороне сервера.

На стороне сервера есть файл .crt для HTTPS, здесь нам нужно объединить

cat your_domain.**crt** your_domain.**ca-bundle** >> ssl_your_domain_.crt 

затем перезапустите.

sudo service nginx restart

У меня работает нормально.

person prabha    schedule 18.09.2020