2017-11-16 17 views
0

Javaクライアントからの接続を許可します。Java JDBC公開鍵接続が失敗しました:「要求されたターゲットへの有効な証明書パスを見つけることができません」

このJavaクライアントは、異なるDBに対して複数の公開鍵をサポートする必要があります。

私はPUBLIC KEYとする必要がありますし、サーバー証明書を信頼してはいけません。

first

second

third

私が持っている:

私はオンラインで検索しましたが、この問題の完全な解決策を見つけることができませんでした、これらは私が読んだのリンクをいくつか紹介しますまたこれを読んでくださいlink mytの質問は完全に異なる接続の種類から重複していません - これはconnecitonとのJDBC接続ですSSLとの一般的なURL接続ではありません。

String connectionString = "jdbc:mysql://abcd-efg.rds.amazonaws.com:3306/test?trustServerCertificate=false&useSSL=true&requireSSL=true&verifyServerCertificate=true" 


    File f = new File("C:\\temp\\amazonPublic.pem"); 
    CertificateFactory fact = null; 
    fact = CertificateFactory.getInstance("X.509"); 
    X509Certificate cer = (X509Certificate) fact.generateCertificate(new FileInputStream(f)); 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    char[] password = new char[] {'1','2','3','4'}; 
    ks.load(null, password); 
    ks.setCertificateEntry("alias", cer); 
    FileOutputStream fos = new FileOutputStream(new File("C:\\temp\\ca.cer")); 
    ks.store(fos, password); 
    fos.close(); 
    Properties p = new Properties(); 
    p.setProperty("javax.net.ssl.trustStore","C:\\temp\\ca.cer"); 
    p.setProperty("javax.net.ssl.trustStorePassword","1234"); 
    try (java.sql.Connection connection = 
      DriverManager.getConnection(connectionString,p)) { 

     connection.isValid(1000); 
    } 

そして、これは誤りです:

これは私のコードである公開鍵認証をスキップ意味サーバ証明書を信頼することを申し出た私が見つけた

と、より多くの、すべてのスタックオーバーフロー液

Caused by: java.sql.SQLException: Could not connect to yyyyy-zz-prd-xxxxxxxxxxxx-1.rds.amazonaws.com:3306: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProtocol.java:706) 
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:406) 
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1022) 
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:483) 
    at org.mariadb.jdbc.Driver.connect(Driver.java:106) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496) 
    ... 17 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
    ... 23 more 

解決策には何が欠けていますか?人類の便宜上

+0

なぜあなたの接続文字列は 'jdbc:mysql'で始まりますが、あなたの例外は' org.mariadb'によって引き起こされますか? – pedrofb

+1

Maria JDBCは私のSQLライセンスをサポートしています – 2Big2BeSmall

+0

아마amazonPublic.pemをJKSまたはPKCS12キーストアにインポートする必要があります。 .pemファイルまたは.cerファイルを 'javax.net.ssl.trustStore'と直接使用することはできません – pedrofb

答えて

0

MariaDBドライバでの作業中 - それをデバッグ、私はそれを見つける:System.setProperty

でだから、この単純な変更を作業するときにプロパティがjavax.net.ssl"serverSslCert"または"trustStore" 接頭辞でなければなりませんのみ必要 トリックをしました。

Properties p = new Properties(); 
    p.setProperty("serverSslCert","C:/temp/amazonPublic.pem"); 
    p.setProperty("trustStorePassword",jdbcDetails.getSensitiveData()); 
    p.setProperty("user",jdbcDetails.username); 
    p.setProperty("password",jdbcDetails.getSensitiveData()); 
関連する問題