2009-08-13 11 views
2

Hier ist ein Code, den ich aus dem Internet kopiertHerunterladen einer Datei über https über 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(); 
     } 
    } 
} 

jetzt wegen der Linie

  int status = client.executeMethod(get); 

ich die folgende Fehlermeldung erhalten

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 

Der Grund für diesen Fehler ist natürlich, dass das von meinem Server gesendete Zertifikat nicht bereits in meiner Liste der vertrauenswürdigen Zertifikate ist. Meine Frage ist, wie man das Zertifikat in die vertrauenswürdige Liste bekommt.

Dank Pranabesh

Antwort

3

Diese Seite scheint Ihre Frage zu beantworten: Adding Certificates to your Java Keystore

Es verweist InstallCert Andres Sterbenz & explanation blog post.

Sie möchten das Zertifikat in Ihrem vertrauenswürdigen Speicher möglicherweise nicht hinzufügen, wenn es nur zum Testen dient. So können Sie auch disable certificate validation.

+2

Dank lot.You wahrscheinlich hat mir geholfen, einen Job zu bekommen. –

+2

Mann, was für eine befriedigende Rückmeldung;) –

2

Sie benötigen einen Schlüsselspeicher, der das vertrauenswürdige Zertifikat enthält. Sie können dazu den Befehl keytool von Java verwenden. Es gibt ein paar Möglichkeiten, dies zu tun:

  • Fügen Sie es zu dem Standard-Java-Schlüsselspeicher (.keystore in Ihrem Home-Verzeichnis oder Benutzerverzeichnis unter Windows)
  • die Systemeigenschaft Set javax.net.ssl.trustStore an den Ort eines alternativen Schlüsselspeichers (so etwas wie java -Djavax.net.ssl.trustStore=/path/to/keystore)
  • Bauen Sie Ihre eigene SSLSocketFactory Implementierung, die einen Schlüsselspeicher, wie Sie wollen laden kann (dies ist auf jeden Fall das komplizierteste)

ein Schlüsselspeicher ist nur eine Datei tha t enthält Schlüssel und/oder Zertifikate, die für verschiedene Dinge verwendet werden können, in diesem Fall ein Zertifikat, dem Ihre Anwendung vertrauen muss. Keytool können wie folgt verwendet werden:

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

Für andere Befehlszeilenoptionen, führen Sie einfach

keytool -help