Как исправить ошибку «java.security.cert.CertificateException: нет альтернативных имен субъектов»?

109

У меня есть клиент веб-службы Java, который использует веб-службу через HTTPS.

import javax.xml.ws.Service;

@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
    extends Service
{

    public ISomeService() {
        super(__getWsdlLocation(), ISOMESERVICE_QNAME);
    }

Когда я подключаюсь к URL-адресу службы ( https://AAA.BBB.CCC.DDD:9443/ISomeService), я получаю исключение java.security.cert.CertificateException: No subject alternative names present.

Чтобы исправить это, я сначала запустил openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txtи получил следующее содержимое в файле certs.txt:

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=someSubdomain.someorganisation.com
   i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5            
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx:                 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    Start Time: 1382521838
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

AFAIK, теперь мне нужно

  1. извлеките часть certs.txtмежду -----BEGIN CERTIFICATE-----и -----END CERTIFICATE-----,
  2. измените его так, чтобы имя сертификата было равно AAA.BBB.CCC.DDDи
  3. затем импортируйте результат с помощью keytool -importcert -file fileWithModifiedCertificate(где fileWithModifiedCertificate- результат операций 1 и 2).

Это верно?

Если да, то как именно заставить сертификат из шага 1 работать с IP-адресом adddress ( AAA.BBB.CCC.DDD)?

Обновление 1 (23.10.2013 15:37 МСК): В ответ на аналогичный вопрос я прочитал следующее:

Если вы не контролируете этот сервер, используйте его имя хоста (при условии, что в существующем сертификате есть хотя бы CN, соответствующий этому имени хоста).

Что именно означает «использовать»?

Mentiflectax
источник

Ответы:

153

Я исправил проблему, отключив проверки HTTPS, используя подход, представленный здесь :

Я поместил в ISomeServiceкласс следующий код :

static {
    disableSslVerification();
}

private static void disableSslVerification() {
    try
    {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
}

Поскольку я использую только https://AAA.BBB.CCC.DDD:9443/ISomeServiceдля тестирования, это достаточно хорошее решение.

Mentiflectax
источник
Подход, упомянутый в указанной выше ссылке, по-видимому, заблокирован ( nakov.com/blog/2009/07/16/… ). Может кто ссылку обновить?
Джон
Я попытался отключить проверку, выполняя этот процесс, но проверка браузера для протоколов SSL (уязвимость Poodle) дает мне: ssl_error_no_cypher_overlap. Любые идеи?
will824
Здравствуйте, я получаю org.springframework.web.client.HttpClientErrorException: 403 Forbidden
74
отключение проверки HTTPS не является «решением». Вы должны сказать, что я нашел "заплатку".
Jus12
2
Это вызовет уязвимость в Pre_prod и Production. 1. Сделайте запись хоста в файле хоста Windows 2. Или добавьте имена IP или FQDN в поля альтернативных имен субъектов в сертификатах
Шанкар,
34

У меня такая же проблема и я решил с этим кодом. Я поместил этот код перед первым вызовом моих веб-сервисов.

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier(){

    public boolean verify(String hostname,
            javax.net.ssl.SSLSession sslSession) {
        return hostname.equals("localhost");
    }
});

Все просто и отлично работает.

Вот первоисточник.

Juanmhidalgo
источник
3
Или вы можете просто заменить все тело функции verify () на return hostname.equals("localhost");, если это то, что вы хотите сделать. Это ifсовершенно лишнее.
CVn
Это было простое и быстрое исправление, которое помогло нам протестировать в тестовой среде поставщика, не имеющей надлежащего сертификата. Бесконечно благодарен!
dacDave 08
@ JuanM.Hidalgo, который работал у меня, поместил приведенный выше код прямо перед вызовом HttpsURLConnection connection = (HttpsURLConnection) obj.openConnection();. Кроме того, игнорирует ли это каждый сертификат? Поскольку я видел, что такой обходной путь уязвим для безопасности. Спасибо!
ThunderWiring 02
этот ответ решил мое исключение сертификата SSL и проблему с символами, отличными от LDH, я мог видеть, что в открытом JDK сообщается об ошибке, bugs.openjdk.java.net/browse/JDK-8170265
Akhil S.
28

Это старый вопрос, но у меня была такая же проблема при переходе с JDK 1.8.0_144 на jdk 1.8.0_191

Мы нашли подсказку в журнале изменений:

Журнал изменений

мы добавили следующее дополнительное системное свойство, которое в нашем случае помогло решить эту проблему:

-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
Маркус
источник
25

Проверка подлинности сертификата выполняется по тому, что запрашивает клиент.

Когда ваш клиент использует https://xxx.xxx.xxx.xxx/something(гдеxxx.xxx.xxx.xxx - IP-адрес), удостоверение сертификата проверяется по этому IP-адресу (теоретически, только с использованием расширения IP SAN).

Если в вашем сертификате нет IP SAN, но есть DNS SAN (или, если нет DNS SAN, общее имя в DN субъекта), вы можете заставить это работать, заставив ваш клиент использовать URL-адрес с этим именем хоста вместо этого (или именем хоста). для которого сертификат будет действителен, если существует несколько возможных значений). Например, если у вашего сертификата есть имя www.example.com, используйте https://www.example.com/something.

Конечно, вам понадобится это имя хоста для разрешения на этот IP-адрес.

Кроме того, если есть какие-либо DNS SAN, CN в DN субъекта будет проигнорирован, поэтому в этом случае используйте имя, которое соответствует одному из DNS SAN.

Бруно
источник
1
Я не могу получить доступ к сервису через http://www.example.com/someservice. Верно ли, что для того, чтобы сертификат работал с IP-адресом ( https://AAA.BBB.CCC.DDD:9443/ISomeService), мне нужно установить все CNполя на AAA.BBB.CCC.DDD(заменить someSubdomain.someorganisation.comна AAA.BBB.CCC.DDDв приведенном выше файле) и импортировать полученный файл сертификата?
Mentiflectax
Вы ничего не можете сделать с CN или сертификатом, если вы не контролируете сервер.
Бруно
для доступа к IP-адресу в тестовых целях вы можете временно изменить свой /etc/hostsфайл или его эквивалент
tyoc213
1
В моем коде я отправлял запрос на общедоступный IP-адрес, но сертификат CN был именем хоста. Поэтому в моем коде я заменил IP именем хоста и настроил свой / etc / hosts так, чтобы связать это имя хоста с IP. Решено!
Леопольд Голт
15

Чтобы импортировать сертификат:

  1. Извлеките сертификат с сервера, например, openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txtэто извлечет сертификаты в формате PEM.
  2. Преобразуйте сертификат в формат DER, поскольку это то, что ожидает keytool, например openssl x509 -in certs.txt -out certs.der -outform DER
  3. Теперь вы хотите импортировать этот сертификат в системный файл cacert по умолчанию. Найдите системный файл cacerts по умолчанию для вашей установки Java. Взгляните на Как получить расположение cacerts установки Java по умолчанию?
  4. Импортируйте сертификаты в этот файл cacerts: sudo keytool -importcert -file certs.der -keystore <path-to-cacerts>пароль cacerts по умолчанию - changeit.

Если сертификат выдан для полного доменного имени, и вы пытаетесь подключиться по IP-адресу в своем Java-коде, то это, вероятно, следует исправить в вашем коде, а не вмешиваться в сам сертификат. Измените свой код для подключения по FQDN. Если полное доменное имя не разрешается на вашем компьютере разработчика, просто добавьте его в файл хостов или настройте свой компьютер с DNS-сервером, который может разрешить это полное доменное имя.

andreycpp
источник
«Если полное доменное имя не разрешается на вашем компьютере разработчика, просто добавьте его в файл хостов» - помогло. Большое спасибо!
Воланд
Я сделал то же самое, но проблема не исчезла. Что еще можно сделать с помощью этого подхода?
pkgajulapalli
9

Я исправил эту проблему правильным образом, добавив альтернативные имена субъектов в сертификат, вместо того, чтобы вносить какие-либо изменения в код или отключать SSL, в отличие от того, что предлагают здесь другие ответы. Если вы ясно видите, что в исключении говорится, что «Альтернативные имена субъектов отсутствуют», правильным способом будет их добавление.

Пожалуйста, перейдите по этой ссылке, чтобы понять шаг за шагом .

Вышеупомянутая ошибка означает, что в вашем JKS-файле отсутствует необходимый домен, на котором вы пытаетесь получить доступ к приложению. Вам потребуется использовать Open SSL и ключевой инструмент для добавления нескольких доменов.

  1. Скопируйте openssl.cnf в текущий каталог
  2. echo '[ subject_alt_name ]' >> openssl.cnf
  3. echo 'subjectAltName = DNS:example.mydomain1.com, DNS:example.mydomain2.com, DNS:example.mydomain3.com, DNS: localhost'>> openssl.cnf
  4. openssl req -x509 -nodes -newkey rsa:2048 -config openssl.cnf -extensions subject_alt_name -keyout private.key -out self-signed.pem -subj '/C=gb/ST=edinburgh/L=edinburgh/O=mygroup/OU=servicing/CN=www.example.com/emailAddress=postmaster@example.com' -days 365
  5. Экспортируйте файл открытого ключа (.pem) в формат PKS12. Вам будет предложено ввести пароль

    openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in
    self-signed.pem -inkey private.key -name myalias -out keystore.p12
  6. Создайте .JKS из самоподписанного PEM (хранилища ключей)

    keytool -importkeystore -destkeystore keystore.jks -deststoretype PKCS12 -srcstoretype PKCS12 -srckeystore keystore.p12
  7. Создайте сертификат из указанного выше хранилища ключей или файла JKS

    keytool -export -keystore keystore.jks -alias myalias -file selfsigned.crt
  8. Поскольку указанный выше сертификат является самоподписанным и не проверяется центром сертификации, его необходимо добавить в Truststore (файл Cacerts находится в расположении ниже для MAC, для Windows узнайте, где установлен JDK).

    sudo keytool -importcert -file selfsigned.crt -alias myalias -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Оригинальный ответ размещен по этой ссылке здесь .

Абхишек Галода
источник
4

Возможно, вы не захотите отключать всю проверку ssl, поэтому вы можете просто отключить проверку hostName с помощью этого, что немного менее страшно, чем альтернатива:

HttpsURLConnection.setDefaultHostnameVerifier(
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

[РЕДАКТИРОВАТЬ]

Как упоминалось conapart3 SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER, теперь устарело, поэтому его можно удалить в более поздней версии, поэтому в будущем вы можете быть вынуждены откатить свой собственный, хотя я бы все же сказал, что я бы держался подальше от любых решений, в которых вся проверка отключена.

жизненный
источник
2
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERустарела.
conapart3,
3

Моя проблема с получением этой ошибки была решена путем использования полного URL «qatest.ourCompany.com/webService» вместо просто «qatest / webService». Причина заключалась в том, что в нашем сертификате безопасности был подстановочный знак, например «* .ourCompany.com». Как только я ввел полный адрес, исключение исчезло. Надеюсь это поможет.

Шахриар
источник
2

Ответили на него уже в https://stackoverflow.com/a/53491151/1909708 .

Это не удается, потому что ни общее имя сертификата ( CNв сертификации Subject), ни какое-либо из альтернативных имен ( Subject Alternative Nameв сертификате) не совпадают с целевым именем хоста или IP-адресом.

Например, из JVM при попытке подключиться к IP-адресу ( WW.XX.YY.ZZ), а не к DNS-имени ( https://stackoverflow.com ), HTTPS-соединение не удастся, потому что сертификат, хранящийся в хранилище доверенных сертификатов Java, cacertsожидает общего имени (или альтернативное имя сертификата, например stackexchange.com или * .stackoverflow.com и т. д.), чтобы соответствовать целевому адресу.

Пожалуйста, проверьте: https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#HostnameVerifier

    HttpsURLConnection urlConnection = (HttpsURLConnection) new URL("https://WW.XX.YY.ZZ/api/verify").openConnection();
    urlConnection.setSSLSocketFactory(socketFactory());
    urlConnection.setDoOutput(true);
    urlConnection.setRequestMethod("GET");
    urlConnection.setUseCaches(false);
    urlConnection.setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    });
    urlConnection.getOutputStream();

Выше передан реализованный HostnameVerifierобъект, который всегда возвращает true:

new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    }
Химадри брюки
источник
1

Для весенней загрузки RestTemplate:

  • добавить org.apache.httpcomponents.httpcoreзависимость
  • использовать NoopHostnameVerifierдля фабрики SSL:

    SSLContext sslContext = new SSLContextBuilder()
            .loadTrustMaterial(new URL("file:pathToServerKeyStore"), storePassword)
    //        .loadKeyMaterial(new URL("file:pathToClientKeyStore"), storePassword, storePassword)
            .build();
    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
    CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client);
    RestTemplate restTemplate = new RestTemplate(factory);
Григорий Кислин
источник
0

Я получил этот вопрос после того, как получил такое же сообщение об ошибке. Однако в моем случае у нас было два URL-адреса с разными поддоменами ( http://example1.xxx.com/someservice и http://example2.yyy.com/someservice ), которые были направлены на один и тот же сервер. На этом сервере был только один подстановочный сертификат для домена * .xxx.com. При использовании сервиса через второй домен найденный сертификат (* .xxx.com) не совпадает с запрошенным доменом (* .yyy.com) и возникает ошибка.

В этом случае мы не должны пытаться исправить такое сообщение об ошибке, снижая безопасность SSL, а должны проверить сервер и сертификаты на нем.

Герт
источник
0
public class RESTfulClientSSL {

    static TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            // TODO Auto-generated method stub
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            // TODO Auto-generated method stub
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
        }
    }};

    public class NullHostNameVerifier implements HostnameVerifier {
        /*
         * (non-Javadoc)
         *
         * @see javax.net.ssl.HostnameVerifier#verify(java.lang.String,
         * javax.net.ssl.SSLSession)
         */
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            // TODO Auto-generated method stub
            return true;
        }
    }

    public static void main(String[] args) {

        HttpURLConnection connection = null;
        try {

            HttpsURLConnection.setDefaultHostnameVerifier(new RESTfulwalkthroughCer().new NullHostNameVerifier());
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());


            String uriString = "https://172.20.20.12:9443/rest/hr/exposed/service";
            URL url = new URL(uriString);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            //connection.setRequestMethod("POST");

            BASE64Encoder encoder = new BASE64Encoder();
            String username = "admin";
            String password = "admin";
            String encodedCredential = encoder.encode((username + ":" + password).getBytes());
            connection.setRequestProperty("Authorization", "Basic " + encodedCredential);

            connection.connect();
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                StringBuffer stringBuffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                String content = stringBuffer.toString();
                System.out.println(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
user11888077
источник
1
пожалуйста, добавьте пояснительный текст к вашему коду. См stackoverflow.com/help/how-to-answer
jasie
1
Это недостаток безопасности. Так в первую очередь отключают проверку сертификата. Каждый, кто копирует это решение, создаст ошибку безопасности в своем программном обеспечении.
Марек Пухальски
0

Я использовал двухсторонний SSL в Springboot. Я выполнил все правильные настройки сервера tomcat службы и вызывающей службы RestTemplate. но я получал сообщение об ошибке «java.security.cert.CertificateException: нет альтернативных имен субъектов»

Пройдя через решения, я обнаружил, что JVM нужен этот сертификат, иначе он выдает ошибку установления связи.

Теперь, как добавить это в JVM.

перейдите в файл jre / lib / security / cacerts. нам нужно добавить файл сертификата нашего сервера в этот файл cacerts jvm.

Команда для добавления сертификата сервера в файл cacerts через командную строку в Windows.

C: \ Program Files \ Java \ jdk1.8.0_191 \ jre \ lib \ security> keytool -import -noprompt -trustcacerts -alias sslserver -file E: \ spring_cloud_sachin \ ssl_keys \ sslserver.cer -keystore cacerts -storepass changeit

Проверьте, установлен ли сертификат сервера:

C: \ Program Files \ Java \ jdk1.8.0_191 \ jre \ lib \ security> keytool -list -keystore cacerts

вы можете увидеть список установленных сертификатов:

для получения дополнительной информации: https://sachin4java.blogspot.com/2019/08/javasecuritycertcertificateexception-no.html

Сачин Рэйн
источник
0

добавить запись хоста с IP, соответствующим CN в сертификате

CN = someSubdomain.someorganisation.com

теперь обновите ip с именем CN, где вы пытаетесь получить доступ к URL-адресу.

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

Manoj
источник
0

Этот код будет работать как шарм и будет использовать объект restTemple для остальной части кода.

  RestTemplate restTemplate = new RestTemplate();   
  TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
            @Override
            public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {
                return true;
            }

        };

        SSLContext sslContext = null;
        try {
            sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);

        restTemplate.setRequestFactory(requestFactory);
}
Низам Махаммад
источник
0

Если у вас есть сертификат как с CN, так и с альтернативными именами субъектов (SAN), если вы делаете запрос на основе содержимого CN, то этот конкретный контент также должен присутствовать в SAN, в противном случае он завершится с ошибкой.

В моем случае у CN было что-то, у SAN было что-то еще. Мне пришлось использовать URL-адрес SAN, и тогда он работал нормально.

Тюдор
источник
-3

Добавьте свой IP-адрес в файл hosts, который находится в папке C: \ Windows \ System32 \ drivers \ etc. Также добавьте IP и доменное имя IP-адреса. пример: aaa.bbb.ccc.ddd abc@def.com

Пракаш Сони
источник
-5

Я решил вопрос следующим образом.

1. Создание класса. В классе есть пустые реализации

class MyTrustManager implements X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    return null;
}

public void checkClientTrusted(X509Certificate[] certs, String authType) {
}

public void checkServerTrusted(X509Certificate[] certs, String authType) {
}

@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
        throws CertificateException {
    // TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
        throws CertificateException {
    // TODO Auto-generated method stub

}

2. Создание метода

private static void disableSSL() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[] { new MyTrustManager() };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

  1. Вызовите метод disableSSL (), в котором возникает исключение. Работало нормально.
Адитья Бхуян
источник