2009-07-23 4 views
3

Я хотел бы контролировать простой URL-адрес. Но когда его https-сервер, я получаю сообщение handshake exception. Его можно проверить состояние https url, как браузер использовать для подключения? (без локального сертификата). Я не знаю, как делают браузеры, чтобы получить контент с https-url, но я хотел бы сделать то же самое. Без необходимости хранить конкретный сертификат для каждого сервера. Мониторинг https должен быть кем угодно.Мониторинг HTTPS-соединения с классом URL (Java)

try { 
    URL u = new URL(row.getUrl()); 
    String protocol = u.getProtocol(); 
    if(protocol.equals("https")) { 
     HttpsURLConnection hc = (HttpsURLConnection)u.openConnection(); 
     System.out.println("Response Code: " + hc.getResponseCode()); 
     hc.disconnect(); 
    } 
    if(protocol.equals("http")) { 
    u.openConnection(); 
    u.getContent(); 
    } 
    System.out.println("url is up."); 
} catch (Exception e) { 
    (...) 
} 
+0

Доверен ли серверный сертификат? То есть подписанный ЦС и не истек? Если нет, то вам, возможно, придется сделать некоторые уговоры, чтобы заставить его работать правильно. Принятие самоподписанных сертификатов может потребовать дополнительной работы. –

+0

нет, это должен быть любой хост, который вам нравится проверять наличие. –

ответ

3

Если вы действительно не заботятся о подлинности сертификата сервера, то вы хотите установить SSLContext, который имеет TrustManager, что ничего не проверять. Затем вам нужно использовать это, чтобы установить значение по умолчанию SSLSocketFactory в HttpsURLConnection, чтобы доверительный менеджер использовался, когда вы используете URL. Вот пример:

TrustManager[] trustEverything = new TrustManager[] { 
    new X509TrustManager() { 
     public X509Certificate[] getAcceptedIssuers() { return null; } 
     public void checkClientTrusted(X509Certificate[] certs, String authType) { } 
     public void checkServerTrusted(X509Certificate[] certs, String authType) { } 
    } 
}; 

SSLContext sslctx = SSLContext.getInstance("SSL"); 
sslctx.init(null, trustEverything, null); 

HttpsURLConnection.setDefaultSSLSocketFactory(sslctx.getSocketFactory()); 

Полный пример использования этого метода можно найти here.

Как отмечает @erickson, это означает, что вы не можете сказать, действительно ли вы разговариваете с сервером, о котором вы беспокоитесь. Еще лучшее решение - обновить свой магазин доверия, чтобы включить самозаверяющий сертификат сервера, с которым вы разговариваете, вместо того, чтобы игнорировать все проверки.

+0

Я подошел к некоторым проблемам, но нашел это из вашего примера: http://www.java-samples.com/showtutorial.php?tutorialid=211 Теперь он работает. Благодарю. –

+0

Хорошее решение, но просто помните: вы только проверяете, что «какой-то» сервер работает; вы потеряли аутентификацию сервера, так что вы не знаете наверняка, является ли это вашим или паролем. – erickson

+0

Спасибо @Ruben Trancoso, рад, что я могу указать вам в правильном направлении. Я добавлю эту ссылку к моему ответу. –

Смежные вопросы