目前我嘗試使播放應用程序能夠與數據庫加密通信SSL。 我爲mysql創建了自簽名證書和CA.有沒有異議通常情況下,我可以與數據庫服務器的應用程序通信加密,當我這個CA添加到JAVA_OPTS多個信任庫在播放框架 - jvm
-Djavax.net.ssl.trustStore=/app/path/conf/truststore
一切順利,直到我的應用程序不能試圖通過SSL其他站點進行通信:
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
[...]
的錯誤是很明顯的:Twitter的SSL證書無法進行檢查,因爲我信任不包含Twitter的簽署證書的CA。 IIRC我無法爲JVM添加多個「javax.net.ssl.trustStore」參數,因此我必須將我的CA注入到播放框架中。對於運氣,遊戲框架支持SSL和有關文件,我可以添加多個信任庫:https://www.playframework.com/documentation/2.4.x/WsSSL 我創建了SSL配置文件:
play.ws.ssl {
trustManager = {
stores = [
{ path: /path/to/truststore, type: "JKS", password = "<whatever is it" }
{ path: ${java.home}/lib/security/cacerts } # Default trust store
]
}
但是當我啓動服務器,我得到了以下錯誤消息:
Oops, cannot start the server.
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
現在,我卡住了。我可以爲JVM注入我的信任庫,但是當我這樣做時,應用程序無法與其他啓用SSL的主機通信 - 沒有證書,但是當我嘗試添加信任庫用於播放框架時,它不接受它,因爲沒有人簽署我的證書。 有沒有辦法解決這個問題?我懷疑如果我使用系統範圍的cacert文件(由java使用)和我的信任庫,然後將它們與keytool合併,它將解決此問題,但這不是最好的方法 - 如果可以的話,它會更加理智將我的自簽名證書打包在應用程序旁邊。