Nano Hash - криптовалюты, майнинг, программирование

Прием сертификатов в Java

У меня проблемы с взаимодействием с HTTPS-сайтом через Java. Моя программа использует один URL-адрес с ненадежным сертификатом при каждом запуске программы. Эта программа должна работать более чем на одной системе. В настоящее время у меня есть следующее:

public class A{
    HostnameVerifier hv = new HostnameVerifier(){
        public boolean verify(String urlHostName, SSLSession session){
            return true;
        }       
    };

    HttpsURLConnection.setDefaultHostnameVerifier(hv);

    javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
    javax.net.ssl.TrustManager tm = new miTM();
    trustAllCerts[0] = tm;
    javax.net.ssl.SSLContext sc = null;
    try {
        sc = javax.net.ssl.SSLContext.getInstance("SSL");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        sc.init(null, trustAllCerts, null);
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
   javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager{

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

    public boolean isServerTrusted(java.security.cert.X509Certificate[] certs){
        return true;
        }

    public boolean isClientTrusted(java.security.cert.X509Certificate[] certs){
        return true;
    }

    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{
        return;
    }

    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{
        return;
        }
}

С помощью этого кода я могу выполнить следующее:

URL url = new URL(urlString);
URLConnection cnx = url.openConnection();
cnx.connect();

InputStream ins = cnx.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
String curline;
while( (curline = in.readLine()) != null ) {
     System.out.println(curline);
}

Однако я не могу сделать следующее:

httpClient = new HttpClient();
PostMethod postMethod = null;
int intResult = 0;
postMethod = new PostMethod(authURL);
Enumeration emParams = authParams.propertyNames();
while (emParams.hasMoreElements()) {
  String paramName = (String) emParams.nextElement();
  String paramValue = authParams.getProperty(paramName);
     postMethod.addParameter(paramName, paramValue);
}

intResult = httpClient.executeMethod(postMethod);
postMethod.releaseConnection();
ins.close();

Когда выполняется executeMethod(postMethod), я получаю SSLHandshakeException, CertPathBuilderException и т.д.

Что я могу сделать, чтобы исправить это? Я думаю либо принять сертификат, либо просто обойти все проверки сертификата (поскольку программа работает внутри частной сети).

Спасибо


  • Вы используете Apache HttpClient 3.x (или 4)? 30.01.2012

Ответы:


1

Похоже, вы используете Apache HttpClient 3. Если это действительно версия 3, вам нужно создать собственный SecureProtocolSocketFactory, как описано в Руководство по Apache HttpClient 3 SSL. Здесь есть пример.

Для Apache HttpClient 4 вы должны иметь возможность передать SSLContext конструктору (HttpClient) SSLSocketFactory, как описано в ответах на этот вопрос (включая примечания относительно проверки имени хоста).

Однако, вообще говоря, не используйте этот подход. Таким образом вы полностью отключаете аутентификационную часть соединения SSL/TLS, тем самым делая его уязвимым для MITM-атак.

Вместо этого вы должны явно импортировать сертификат сервера в хранилище доверенных сертификатов вашего клиента, как описано в этом ответе.

Я думаю либо принять сертификат, либо просто обойти все проверки сертификата (поскольку программа работает внутри частной сети).

То, что вы говорите, это то, что вы готовы использовать SSL/TLS для шифрования только в вашей частной сети, потому что вы недостаточно доверяете ее пользователям, чтобы не смотреть на трафик, который может идти вокруг их машин, но вы также предполагая, что эти пользователи не смогут выполнить атаку MITM. Это не совсем понятно. Если вы достаточно доверяете им, вы можете отправить данные в чистом виде. Если вы этого не сделаете, вам следует правильно реализовать SSL/TLS, включая этапы аутентификации (проверка сертификата и имени хоста).

30.01.2012
  • Спасибо! Я использовал Apache HttpClient 3.x, но решил использовать 4. Я последовал вашей рекомендации, и это сработало. Еще раз спасибо. 01.02.2012

  • 2

    HTTP-клиент 4.3:

         HttpClientBuilder cb = HttpClientBuilder.create();
         SSLContextBuilder sslcb = new SSLContextBuilder();
         sslcb.loadTrustMaterial(KeyStore.getInstance(KeyStore.getDefaultType()), new TrustSelfSignedStrategy());
         cb.setSslcontext(sslcb.build());
         CloseableHttpClient httpclient = cb.build();
    
    02.09.2014
  • не могли бы вы объяснить это немного? 02.09.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..