2010-12-15 75 views
2

J'essaie de configurer un programme Java pour me connecter à un site Web qui utilise le protocole SSL. Je l'ai pleinement travailler pour un site HTTP standard, mais pas pour les HTTP. Mon problème est que je n'ai pas mon certificat signé. Comment puis-je java ignorer le fait qu'il n'est pas signé et me laisser me connecter de toute façon? Je reçois cette erreur lorsque je tente de se connecter:Connexion à un site HTTP non signé à l'aide de Java Sockets

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
    at util.Watchlist.getWatchListWebsiteReaderSSL(Watchlist.java:51) 
    at util.Watchlist.updateWLDP(Watchlist.java:64) 
    at util.Watchlist.getWLDP(Watchlist.java:24) 
    at commands.devices.cpt.WldpMessage.run(WldpMessage.java:52) 
    at cli.Parser.Parse(Parser.java:74) 
    at fromUI.UISocketReader.run(UISocketReader.java:54) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source) 
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) 
    at sun.security.validator.Validator.validate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) 
    ... 19 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) 
    at java.security.cert.CertPathBuilder.build(Unknown Source) 
    ... 25 more 

Répondre

0

Vous devez créer un TrustManager qui accepte les certificats non signés et associés qui avec le SSLContext utilisé pour les connexions HTTPS. Il est un exemple simple à http://www.exampledepot.com/egs/javax.net.ssl/trustall.html

// Create a trust manager that does not validate certificate chains 
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()); 
} catch (Exception e) { 
} 

// Now you can access an https URL without having the certificate in the 
// truststore 
try { 
    URL url = new URL("https://hostname/index.html"); 
} catch (MalformedURLException e) { 
} 

S'il vous plaît noter que l'exemple lié ne fait pas de vérification que ce soit sur le certificat SSL du serveur ainsi vous ne serez pas en mesure de faire confiance pleinement l'identité du site vous vous connectez.

+0

Eh bien, cela m'a un peu plus loin. Je reçois maintenant une "alerte fatale reçue: bad_record_mac". Je pense que cela peut avoir à voir avec la version SSL sur le serveur. Si vous le savez, faites le moi savoir. Votre aide a été géniale cependant! – Kellenjb

+0

TrustManager n'est pas conforme à ses spécifications. La technique d'acceptation de tous les certificats ne doit jamais être utilisée dans le code de production car elle brise fondamentalement la sécurité SSL. Voir la discussion dans la RFC 2246. – EJP

+0

@EJP Je ne fais que travailler sur une preuve de concept pour affaiblir le SSL. En production SSL sera signé. – Kellenjb