2009-08-13 8 views
2

Voici un code que je copié à partir du WebLe téléchargement d'un fichier via https sur java

/** 
* A simple example that uses HttpClient to perform a GET using Basic 
* Authentication. Can be run standalone without parameters. 
* 
* You need to have JSSE on your classpath for JDK prior to 1.4 
* 
* @author Michael Becke 
*/ 
public class BasicAuthenticationExample { 

    /** 
    * Constructor for BasicAuthenticatonExample. 
    */ 
    public BasicAuthenticationExample() { 
     super(); 
    } 

    public static void main(String[] args) throws Exception { 
     HttpClient client = new HttpClient(); 

     client.getState().setCredentials(
       new AuthScope("login.website.com", 443), 
       new UsernamePasswordCredentials("login id", "password") 
       ); 

     GetMethod get = new GetMethod(
       "https://url to the file"); 

     get.setDoAuthentication(true); 

     try { 
      // execute the GET 
      int status = client.executeMethod(get); 

      // print the status and response 
      System.out.println(status + "\n" + 
        get.getResponseBodyAsString()); 

     } finally { 
      // release any connection resources used by the method 
      get.releaseConnection(); 
     } 
    } 
} 

maintenant à cause de la ligne

  int status = client.executeMethod(get); 

je reçois l'erreur suivante

Exception in thread "main" 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.writeRecord(Unknown Source) 
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source) 
at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
at java.io.BufferedOutputStream.flush(Unknown Source) 
at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828) 
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116) 
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096) 
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) 
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) 
at BasicAuthenticationExample.main(BasicAuthenticationExample.java:38) 
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) 
... 18 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) 
... 24 more 

Maintenant, la raison de cette erreur est bien sûr que le certificat envoyé par mon serveur n'est pas déjà dans ma liste de certificats de confiance. Ma question est comment obtenir le certificat dans la liste de confiance.

Merci Pranabesh

Répondre

3

Cette page semble répondre à votre question: Adding Certificates to your Java Keystore

Il fait référence InstallCert & explanation blog post Andres Sterbenz.

Vous ne souhaiterez peut-être pas réellement ajouter le certificat dans votre magasin approuvé, si ce n'est que pour le test. Donc, vous pouvez également disable certificate validation.

+2

Merci un lot.You m'a aidé sans doute à trouver un emploi. –

+2

L'homme, quel retour gratifiant;) –

2

Vous devez disposer d'un fichier de clés contenant le certificat à approuver. Vous pouvez utiliser la commande keytool de Java pour le faire. Il y a quelques façons de le faire:

  • Ajouter à la valeur par défaut Java keystore (.keystore dans votre répertoire ou un répertoire utilisateur sous Windows)
  • Définissez la propriété du système javax.net.ssl.trustStore à l'emplacement d'un keystore autre (quelque chose comme java -Djavax.net.ssl.trustStore=/path/to/keystore)
  • Construisez votre propre SSLSocketFactory mise en œuvre qui peut charger un keystore comme vous le souhaitez (ce qui est certainement le plus compliqué)

un keystore est juste un fichier tha t contient des clés et/ou des certificats qui peuvent être utilisés pour diverses choses, dans ce cas un certificat que votre application devra approuver. Keytool peut être utilisé comme suit:

keytool -importcert -file /path/to/certificate/file -keystore /path/to/keystore 

Pour d'autres options de ligne de commande, il suffit d'exécuter

keytool -help 
Questions connexes