2016-05-05 8 views
2

Derzeit versuche ich, eine Play-Anwendung in der Lage zu sein, SSL verschlüsselt mit der Datenbank zu kommunizieren. Ich habe selbstsigniertes Zertifikat und CA für mysql erstellt. Es gibt kein Problem mit, dass normalerweise, kann ich die Anwendung mit dem DB-Server verschlüsselt machen kommunizieren, wenn ich diese CA auf die JAVA_OPTS hinzufügenMehrere truststores in play framework - jvm

-Djavax.net.ssl.trustStore=/app/path/conf/truststore 

Alles geht gut, bis meine Anwendung versucht, nicht mit anderen Seiten über SSL zu kommunizieren :

java.net.ConnectException: General SSLEngine problem to https://api.twitter.com/1/statuses/oembed.json?<meh> 
    [...] 
    Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem 
    [...] 
    Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem 
    [...] 
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    [...] 

Der Fehler ist ziemlich offensichtlich: ssl cert Gezwitscher kann nicht überprüft werden, weil mein-Vertrauen nicht den CA nicht enthält, die zwitschert Zertifikat signiert. IIRC Ich kann nicht mehr als einen "javax.net.ssl.trustStore" -Parameter für JVM hinzufügen, also muss ich meine CAs in das Play-Framework injizieren. Zum Glück unterstützt Spiel Rahmen ssl und in Bezug auf die Dokumentation kann ich mehrere Truststores hinzufügen: https://www.playframework.com/documentation/2.4.x/WsSSL ich eine Konfigurationsdatei für ssl erstellt:

play.ws.ssl { 
    trustManager = { 
     stores = [ 
     { path: /path/to/truststore, type: "JKS", password = "<whatever is it" } 
     { path: ${java.home}/lib/security/cacerts } # Default trust store 
     ] 
    } 

Aber wenn ich den Server zu starten, bekam ich folgende Fehlermeldung:

Oops, cannot start the server. 
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 

Und jetzt bin ich fest. Ich kann meinen Truststore für JVM injizieren, aber wenn ich das tue, kann die App nicht mit anderen SSL-fähigen Hosts kommunizieren - es gibt kein Zertifikat, aber wenn ich versuche, meinen Truststore für das Playframework hinzuzufügen, akzeptiert er das nicht, weil niemand meine Signatur signiert hat Zertifikat Gibt es eine Möglichkeit, das irgendwie zu lösen? Ich vermute, wenn ich die systemweite cacert-Datei (die von Java verwendet wird) und meinen Truststore nehme, und dann füge ich sie mit keytool zusammen, wird es das lösen, aber das ist nicht der beste Weg - es wäre vernünftiger, wenn ich könnte packen Sie meine selbstsignierten Zertifikate neben die Anwendung.

Antwort

0

Dieser Fehler bedeutet, Play kann die Filialen nicht finden. Ist der Pfad korrekt?

0

Ich hatte das gleiche Problem aus irgendeinem Grund mein eigener Trust Store würde nicht erkannt werden, so dass ich am Ende mein Zertifikat zu den Standard-Keystore ($ {java.home}/lib/security/cacerts) hinzugefügt. Sie können diesen Befehl verwenden, um dies zu tun (BTW cacerts Standardpasswort ist changeit): keytool -v -importkeystore -srckeystore alice.p12 -srcstoretype PKCS12 -destkeystore "c:\Program Files\Java\jre1.8.0_71\lib\security\cacerts" -deststoretype JKS Dann müssen Sie den TrustManager und den Schlüsselmanager definiert haben. Der TrustManager verweist auf den Trust Store und den KeyManager Ihres Zertifikats.

play.ws.ssl { 
    trustManager = { 
    stores = [ 
     { 
     path: ${java.home}/lib/security/cacerts 
     } 
    ] 
    } 
    keyManager = { 
    stores = [ 
     { 
     type: "PKCS12", 
     path: "/Users/work/Documents/path/to/certificate/certificate.p12", 
     password: "pass" 
     } 
    ] 
    } 
}