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.