2016-05-05 7 views
2

現在、私は、プレイアプリケーションをデータベースと暗号化されたSSLで通信できるようにしようとしています。 mysqlの自己署名証明書とCAを作成しました。それに問題は私がJAVA_OPTSにこのCAを追加するとき、私はSSLを介して他のサイトと通信しようとしないプレイフレームワーク内の複数のトラストストア - jvm

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

すべては私のアプリケーションまでうまく行く、アプリケーションは暗号化されたDBサーバと通信することができ、通常はありません:

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の証明書に署名したCAが含まれていないため、さえずりのSSL証明書は、確認することができません。 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)に追加しました。このコマンドを使用して、これを行うことができます(デフォルトのパスワードは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" 
     } 
    ] 
    } 
} 
関連する問題