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:
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?
Warum beginnt Ihre Verbindungszeichenfolge mit 'jdbc: mysql', aber Ihre Ausnahme wird durch' org.mariadb' verursacht? – pedrofb
Maria JDBC unterstützt meine SQL Lizenz Sachen – 2Big2BeSmall
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