Как я использую локальный URL HTTPS в Java?

Я думаю, что кэширование запросов в Hash и доступ к хешу в отдельном GET-запросе, включающем параметр page и request id, должны быть в порядке.

9
задан Sandip Armal Patil 22 October 2012 в 09:26
поделиться

6 ответов

Вот мое решение, которое включает в себя некоторые идеи из этого потока и скомпилировано вместе с кодом из сети. Все, что я вызываю, - это функция, и она устанавливает по умолчанию Trust Manager и HostName Verifier для HttpsURLConnection. Для некоторых это может быть нежелательно, потому что это повлияет на все HttpsURLConnections, но я просто пишу простой прокси, чтобы он работал у меня.

private void setTrustAllCerts() throws Exception
{
    TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType ) { }
            public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType ) { }
        }
    };

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance( "SSL" );
        sc.init( null, trustAllCerts, new java.security.SecureRandom() );
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier( 
            new HostnameVerifier() {
                public boolean verify(String urlHostName, SSLSession session) {
                    return true;
                }
            });
    }
    catch ( Exception e ) {
        //We can not recover from this exception.
        e.printStackTrace();
    }
}
13
ответ дан 4 December 2019 в 11:08
поделиться

Вероятно, необходимо установить a HostnameVerifier. Перед соединением Вы должны добавить его к объекту соединения

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) {
    // check hostname/session
    return true;
  }
});
conn.connect();
// read/write...

Конечно, существуют некоторые реализации там при необходимости в том. Вы могли бы хотеть посмотреть на проект HttpClient также.

3
ответ дан 4 December 2019 в 11:08
поделиться

Другая вещь посмотреть на TrustManager Вы используете. Сообщение об ошибке предполагает, что сертификат, представленный сервером, не подписывается доверяемым корнем. Так как у Вас нет прямого управления сокетом SSL, который создается, я думаю, что Ваш лучший выбор состоит в том, чтобы инициализировать Ваше собственное SSLContext с a TrustManager это было установкой с корневым CA цепочки сертификата сервера. Затем установите этот контекст по умолчанию.

Это предполагает использование Java 6. API более ограничен в Java 5. Можно получить значение по умолчанию SSLSocketFactory, но нет никакого стандартного способа установить его.

3
ответ дан 4 December 2019 в 11:08
поделиться

Проблема, на которую это жалуется, состоит в том, что при создании соединения SSL сервер должен представить действительный сертификат клиенту. Можно записать соответствующую конечную точку в Java (HTTPServerSocket сделает это, я думаю), но требовалось бы некоторое взламывание, собирающееся настраивать его. Вероятно, легче настроить локальный веб-сервер с чем-либо, что обрабатывает SSL правильно---Apache, lighttp, безотносительно---, и создайте самоподписанный сертификат с помощью openssl инструментов.

Обновленный

Вот пример из Альманаха Java. http://www.exampledepot.com/egs/javax.net.ssl/Server.html

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

try {
    int port = 443;
    ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault();
    ServerSocket ssocket = ssocketFactory.createServerSocket(port);

    // Listen for connections
    Socket socket = ssocket.accept();

    // Create streams to securely send and receive data to the client
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();

    // Read from in and write to out...

    // Close the socket
    in.close();
    out.close();
} catch(IOException e) {
}

Укажите keystore сертификатов с помощью javax.net.ssl.keyStore системного свойства:

> java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456 MyServer
0
ответ дан 4 December 2019 в 11:08
поделиться

Это может также помочь Вам добавить сертификат, который localhost сервер использует (я предполагаю, что это самоподписывается) к keystore JVM, с помощью "keytool" утилиты. Это должно иметь эффект сообщения JVM, "можно доверять этому сертификату".

0
ответ дан 4 December 2019 в 11:08
поделиться

Я закончил тем, что выполнил статический метод (только на dev), который устанавливает очень доверчивый TrustManager (принимает все), и также добавил hostnameVerifier, который всегда возвращает true (благодарит sblundy).

0
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: