2017-11-26 9 views
0

私のアプリケーションでMySQL接続をSSLで保護しようとしています。私は今のよう持って関連するコード:BasicDataSourceを使用したSSLによるmysqlへの安全な接続

BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setUsername(connectorConfig.getUser()); 
    dataSource.setPassword(connectorConfig.getPassword()); 
    String uri = connectorConfig.getConnectURI(); 
    dataSource.setUrl(uri); 
    dataSource.setValidationQuery(getValidationQuery()); 
    dataSource.setTestOnBorrow(true); 
    datasource.setDriverClassLoader(getClass().getClassLoader()); 
    datasource.setDriverClassName("com.mysql.jdbc.Driver"); 

    System.setProperty("javax.net.ssl.keyStore", "/Users/xx/xx/client.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "xx"); 
    System.setProperty("javax.net.ssl.trustStore", "/Users/xx/xx/server.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "xx"); 

    final DBI dbi = new DBI(datasource); 

私は、データソース管理のためのDBCP2 BasicDataSourceJDBIクエリを実行するために使用しています。

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

私はMySQLサーバへのSSLコンテキストパラメータを提供行くのですか上の任意の考え:MySQLサーバへの接続を確立しようとしたときに、私は次のエラーを取得するよう しかし、上記のコードは動作しません。この場合?

PS:私は、コマンドラインからクライアントキーストアを使用してMySQLサーバに接続できたので、SSL設定が正しいと思います。

答えて

0

トラストストアにサーバーの証明書を追加できますが、最初にkeytoolコマンドでサーバーの証明書がないことを確認します。 まだ動作していない場合は、デバッグプロパティ(-Djavax.net.debug = all)を使用して、実際に使用しているtruststoreと、交換される証明書を出力でチェックします。

+0

server.jksにはすでにサーバー証明書があります。デバッグモードを使用すると、コードで指定されているトラストストアが無視され、代わりにこのパスが検索されます。/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security/cacerts – seriousgeek

0

System.setPropertyは、私の用途にパラメータを提供する正しい方法ではないことがわかりました。 BasicDataSourceMysqlDataSourceに変更すると、setClientCertificateXX()setTrustCertificateXX()のメソッドを使用してキーストアのパラメータを指定する方法が提供され、現在は動作しているようです。

関連する問題