2009-07-23 10 views
3

Je voudrais surveiller un simple url. Mais quand c'est un serveur https, j'obtiens une exception poignée de main. Est-il possible de vérifier l'état d'une URL https de la façon dont le navigateur utilise pour se connecter? (sans avoir de certificat local). Je ne sais pas comment les navigateurs peuvent obtenir du contenu à partir d'une URL https mais je voudrais le faire de la même manière. Sans avoir besoin de stocker un certificat spécifique pour chaque serveur. Le https surveillé devrait être n'importe qui.Surveiller une connexion HTTPS avec la classe d'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

Le certificat du serveur est-il approuvé? C'est à dire. signé par une autorité de certification et non expiré? Si ce n'est pas le cas, vous devrez peut-être faire quelques cajoleries pour que cela fonctionne correctement. L'acceptation de certificats auto-signés peut nécessiter un travail supplémentaire. –

+0

non, il devrait être un hôte que vous souhaitez tester la disponibilité. –

Répondre

3

Si vraiment vous ne se soucient pas de la validité du certificat du serveur, vous souhaitez définir un SSLContext qui a une TrustManager qui ne vérifie rien. Ensuite, vous devez utiliser cela pour définir le SSLSocketFactory par défaut dans le HttpsURLConnection, de sorte que le gestionnaire de confiance est utilisé lorsque vous utilisez le URL. Voici un exemple:

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

Un exemple complet utilisant cette technique peut être trouvée here. Comme le souligne @erickson, cela signifie que vous ne pouvez pas dire si vous parlez réellement au serveur qui vous préoccupe. Une solution encore meilleure consiste à mettre à jour votre magasin Trust pour inclure le certificat auto-signé du serveur auquel vous parlez, au lieu d'ignorer toutes les vérifications.

+0

Je suis venu à quelques difficultés, mais j'ai trouvé cela à partir de votre échantillon: http://www.java-samples.com/showtutorial.php?tutorialid=211 Maintenant, ça marche. Merci. –

+0

Bonne solution, mais rappelez-vous juste: vous vérifiez seulement que "certains" serveur est en place; vous avez perdu l'authentification du serveur, vous ne savez donc pas si c'est le vôtre ou un usurpation d'identité. – erickson

+0

Merci @Ruben Trancoso, content que je puisse vous pointer dans la bonne direction. Je vais ajouter ce lien à ma réponse. –