2012-04-02 5 views
1

Ich schrieb ein Modul, das über https mit Authentifizierung über den Dienst verbindet. Nach dem Einstellen des richtigen Pfades zum Keystore funktioniert es einwandfrei. Es gibt ein Problem, wenn ich dieses Modul (als Jar) in meiner Tomcat-Anwendung verwenden möchte. Ich setze richtige Pfade (absolute Pfade) als auch zu Keys aber wenn ich versuche ich Handshake AusnahmeSSLHandshakeException, wenn mehrere SSL-Verbindungen

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

erhalten zu verbinden Wie ich mich erinnere ich habe diese Nachricht vor, wenn ich eine falschen Schlüsselspeicher hatte. Muss ich damit mehr machen, damit es unter Tomcat funktioniert? Irgendein anderes Problem, das ich vermisste? Ich verbinde mich über https ohne Authentifizierung mit einem anderen Dienst und das funktioniert gut (in Tomcat-App).

edit: Das Problem bestand darin, ein Projekt auszuführen, das über SSL mit verschiedenen Diensten verbunden ist (nicht nur in Tomcat). Eins mit Authentifizierung, zweites ohne. So editierte ich den Titel

+0

Ist dieser Fehler auf der Client-Seite, oder in Ihrem Tomcat Logs? Dieser Fehler wird normalerweise auf der Clientseite gesehen, wenn Sie das Serverzertifikat (oder eines seiner Elternzertifikate) nicht im Truststore der Clients haben. –

+0

Wo und wie haben Sie Ihren Trust Store konfiguriert? – Bruno

+0

Ihre Antwort scheint zu passen, Sie sollten es akzeptieren (so dass diese Frage als gelöst markiert ist) –

Antwort

1

Noch einmal antworte ich mir selbst. Nach dem Lesen How to control SSLContext scope habe ich mich entschieden, das gleiche zu tun, und es funktioniert gut. Standardmäßig kann ich keine trusts (so Standard cacerts verwendet wird) und wenn ich mich authentifizieren müssen

httpsUrlConnection.setSSLSocketFactory(getSSLContext().getSocketFactory()); 

wenn getSSLContext() gibt, was ich oben geschrieben habe (ohne setDefault)

würde ich gerne wissen, wie man Standard-SSLContext in Tomcat App ändern, also wenn jemand helfen könnte, wäre ich dankbar

+0

Dies ist kein Forum, sondern eine Q & A-Site. Versuchen Sie höchstens eine Antwort auf eine Frage zu haben. Wenn du etwas Neues ausprobiert hast, bearbeite deine Frage, anstatt mehr Details in Antworten auf deine eigene Frage hinzuzufügen. – Bruno

+0

Sorry, ich werde mich daran erinnern – jasiustasiu

1

Setting multiple truststore on the same JVM gab mir eine Antwort. Ich brauchte nur meine Schlüsselfabrik sowie Vertrauensfabrik und es funktioniert :)

System.setProperty legt nicht die SSL-Eigenschaft fest, die bereits festgelegt ist.

// load your key store as a stream and initialize a KeyStore 
    InputStream trustStream = new FileInputStream("Resources/keystore.ImportKey"); 
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 

    // if your store is password protected then declare it (it can be null however) 
    String trustPassword = "changeit"; 

    // load the stream to your store 
    trustStore.load(trustStream, trustPassword.toCharArray()); 

    // initialize a trust manager factory with the trusted store 
    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustFactory.init(trustStore); 

    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    keyFactory.init(trustStore, trustPassword.toCharArray()); 

    // get the trust managers from the factory 
    TrustManager[] trustManagers = trustFactory.getTrustManagers(); 
    KeyManager[] keyManagers = keyFactory.getKeyManagers(); 

    // initialize an ssl context to use these managers and set as default 
    SSLContext sslContext = SSLContext.getInstance("SSL"); 
    sslContext.init(keyManagers, trustManagers, null); 
    SSLContext.setDefault(sslContext); 

funktioniert einfach gut!