2016-05-05 53 views
2

目前我嘗試使播放應用程序能夠與數據庫加密通信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合併,它將解決此問題,但這不是最好的方法 - 如果可以的話,它會更加理智將我的自簽名證書打包在應用程序旁邊。

回答

0

該錯誤意味着Play無法找到商店。路徑是否正確?

0

我有同樣的問題出於某種原因,我自己的信任存儲不會被識別,所以我最終將我的證書添加到默認密鑰庫($ {java.home}/lib/security/cacerts)。您可以使用此命令來執行此操作(BTW cacerts默認密碼爲changeit): keytool -v -importkeystore -srckeystore alice.p12 -srcstoretype PKCS12 -destkeystore "c:\Program Files\Java\jre1.8.0_71\lib\security\cacerts" -deststoretype JKS 然後,您需要定義trustManager和密鑰管理器。 trustManager指向您的證書的信任庫和keyManager。

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" 
     } 
    ] 
    } 
}