2017-11-16 4 views
0

Ich möchte eine Verbindung von einem Java-Client zulassen.Java JDBC Public Key-Verbindung fehlgeschlagen mit: "Ich konnte keinen gültigen Zertifizierungspfad zum angeforderten Ziel finden"

Dieser Java-Client muss mehrere öffentliche Schlüssel für verschiedene DBs unterstützen.

Ich muss es mit einem PUBLIC KEY tun und darf Serverzertifikat nicht vertrauen.

Ich habe Online gesucht, konnte aber nicht eine vollständige Lösung für dieses Problem finden, das sind einige der Links, die ich gelesen habe:

first

second

third

Ich habe Lesen Sie auch diese link Myt Frage ist nicht doppelt, da es ein völlig anderer Verbindungstyp ist - das ist eine JDBC-Verbindung mit Conneciton verwalten r und keine allgemeine URL-Verbindung mit SSL.

und viele mehr, den ganzen Stack-Überlauf-Lösung fand ich angeboten Server-Zertifikat zu vertrauen, die den öffentlichen Schlüssel Verifikationsmittel überspringen

Dies ist mein Code:

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); 
    } 

Und das ist der Fehler:

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 

Was fehlt mir in der Lösung?

+0

Warum beginnt Ihre Verbindungszeichenfolge mit 'jdbc: mysql', aber Ihre Ausnahme wird durch' org.mariadb' verursacht? – pedrofb

+1

Maria JDBC unterstützt meine SQL Lizenz Sachen – 2Big2BeSmall

+0

Sie müssen amazonPublic.pem wahrscheinlich in einen JKS oder PKCS12 Schlüsselspeicher importieren. Sie können nicht direkt eine .pem oder .cer Datei mit 'javax.net.ssl.trustStore' verwenden. – pedrofb

Antwort

0

Aus Gründen der Menschheit, während mit MariaDB Fahrer arbeiten - es ich herausfinden, Debugging, dass: Die Eigenschaft "serverSslCert" oder "trustStore" Das Präfix javax.net.ssl nur erforderlich sein sollte, wenn mit System.setProperty

Also diese einfache Änderung arbeiten Hat den Trick gemacht.

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()); 
Verwandte Themen