2009-07-23 4 views
3

Ich möchte überwachen eine einfache URL. Aber wenn es ein https-Server ist, bekomme ich eine Handshake-Ausnahme. Es ist möglich, den Status einer https-URL zu überprüfen, so wie der Browser die Verbindung herstellt? (ohne ein lokales Zertifikat zu haben). Ich weiß nicht, wie Browser Inhalte von einer https-URL abrufen, aber ich möchte es auf die gleiche Weise machen. Ohne dass ein spezielles Zertifikat für jeden Server gespeichert werden muss. Das https überwacht werden sollte jeder sein.Überwachen Sie eine HTTPS-Verbindung mit URL-Klasse (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

Ist das Zertifikat des Servers vertrauenswürdig? I.e. von einer CA signiert und nicht abgelaufen? Wenn nicht, dann müssen Sie vielleicht ein wenig Spaß machen, damit es richtig funktioniert. Das Akzeptieren selbstsignierter Zertifikate erfordert möglicherweise zusätzliche Arbeit. –

+0

Nein, es sollte jeder Host sein, der die Verfügbarkeit testen möchte. –

Antwort

3

Wenn Sie wirklich etwas kümmern sich nicht, über die Gültigkeit des Zertifikats des Servers dann wollen Sie eine SSLContext setzen, die eine TrustManager hat, die nicht überprüfen ist. Dann müssen Sie das verwenden, um den Standard SSLSocketFactory in HttpsURLConnection zu setzen, so dass der Vertrauensmanager verwendet wird, wenn Sie die URL verwenden. Hier ein Beispiel:

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

Ein vollständiges Beispiel mit dieser Technik here gefunden werden kann.

Wie @erickson bemerkt, bedeutet dies, dass Sie nicht sagen können, ob Sie wirklich mit dem Server sprechen, der Ihnen Sorgen bereitet. Eine noch bessere Lösung besteht darin, Ihren Trust-Speicher so zu aktualisieren, dass das selbstsignierte Zertifikat des Servers, mit dem Sie sprechen, enthalten ist, anstatt alle Prüfungen zu ignorieren.

+0

Ich kam zu einigen kämpfen, aber fand dies aus Ihrer Probe: http://www.java-samples.com/showtutorial.php?tutorialid=211 Jetzt funktioniert es. Vielen Dank. –

+0

Gute Lösung, aber denken Sie daran: Sie überprüfen nur, dass "einige" Server aktiv sind; Sie haben die Server-Authentifizierung verloren, so dass Sie nicht sicher sind, ob es Ihre oder eine Spoof ist. – erickson

+0

Dank @Ruben Trancoso, froh, dass ich Sie in die richtige Richtung zeigen konnte. Ich werde diesen Link zu meiner Antwort hinzufügen. –