Можно ли отключить ssl для https? - PullRequest
0 голосов
/ 22 мая 2019

Приложение на Java.OkHttp версия 2.7.5 используется.Запрос сделан к другой службе, и происходит ошибка.

SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

У меня нет сертификата.Похоже, есть решения для версии okHttp3.Но версия не может быть изменена.Как решить проблему?

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Можно ли отключить ssl для https?

Буквально, нет.

Использование SSL является основополагающим для протокола HTTPS. Если вы вообще не хотите использовать SSL, настройте на сервере конечную точку HTTP и используйте ее вместо HTTPS.

Кроме того, для использования SSL требуется сертификат, который (по крайней мере) синтаксически правильно сформирован. Это также важно для протокола HTTPS.

Теперь, если проблема в том, что срок действия сертификата вашего сервера истек, то возможное решение состоит в том, чтобы использовать подход, описанный в:

И если проблема в том, что вы не можете получить надлежащий сертификат для сервера (например, вы не можете себе это позволить), то альтернативное решение:

  1. создать самозаверяющий сертификат ; см. Как создать самозаверяющий сертификат с помощью Java Keytool ,
  2. установить его на стороне сервера,
  3. настроить клиент, как указано выше, чтобы игнорировать действительность сертификата.

Но учтите, что выполнение любой из этих проблем связано с проблемами безопасности.

Существует третье решение, которое является более безопасным.

  1. создать самозаверяющий сертификат (как указано выше)
  2. установить его на стороне сервера,
  3. используйте Keytool для добавления сертификата в хранилище ключей клиентского приложения в качестве доверенного сертификата.
0 голосов
/ 22 мая 2019

Почему вы хотите использовать HTTPS, но не имеете сертификатов, вы должны следовать указаниям Стивена, упомянутым выше. Однако, если вы хотите буквально забыть, что значит https, вы можете переопределить поведение

 private static OkHttpClient getUnprotectedClient() {
    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 new X509Certificate[0];
                }
            }
        };

        // 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();


        return new okhttp3.OkHttpClient.Builder()
                .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                }).build();

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
...