У меня есть простое Java-приложение, которое открывает соединение с базой данных Oracle. База данных Oracle имеет самоподписанный сертификат. Я экспортировал самозаверяющий сертификат из кошелька Oracle и импортировал его в хранилище доверенных сертификатов Java cacerts.
Однако при запуске программы я все равно вижу ошибку:
javax.net.ssl|ERROR|01|main|2024-09-19 10:35:54.501 CEST|TransportContext.java:352|Fatal (CERTIFICATE_UNKNOWN): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (
"throwable" : {
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Поскольку это самозаверяющий сертификат, «действительного пути сертификации» не существует, но если он находится в хранилище доверенных сертификатов, я ожидаю, что ему следует доверять и эта ошибка не должна возникать .
Код Java
package org.ibm;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class OracleConnection {
public static void main(String[] args) throws Exception {
//Create a custom TrustManager
VerifyCertificate.verifyCert();
String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=localhost)(PORT=5500))(CONNECT_DATA=(SERVICE_NAME=your_db))(SECURITY=(SSL_SERVER_CERT_DN=\"\")))";
Properties props = new Properties();
props.setProperty("user", "sys");
props.setProperty("password", "password");
try (Connection conn = DriverManager.getConnection(url, props)) {
System.out.println("Connected to the database successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
/home/pat/.sdkman/candidates/java/11.0.23-sem/bin/java -Djavax.net.debug=ssl -classpath /home/pat/Projects/clients/blm/oracle-ssl/target/classes:/home/pat/.m2/repository/com/oracle/database/jdbc/ojdbc8/19.8.0.0/ojdbc8-19.8.0.0.jar org.ibm.OracleConnection
Я использовал эту команду для импорта сертификата:
keytool -importcert -v -trustcacerts -cacerts -alias myselfsignedcert -file server_cert.pem -storepass changeit
➜ oracle-ssl git:(master) ✗ echo $JAVA_HOME
/home/pat/.sdkman/candidates/java/current
Откровенно говоря, я озадачен этой ошибкой, потому что во всей документации говорится, что если вы импортируете самозаверяющий сертификат в хранилище доверенных сертификатов Java, он должен ему доверять.
openjdk 11.0.23 2024-04-16
IBM Semeru Runtime Open Edition 11.0.23.0 (build 11.0.23+9)
Eclipse OpenJ9 VM 11.0.23.0 (build openj9-0.44.0, JRE 11 Linux amd64-64-Bit Compressed References 20240522_1104 (JIT enabled, AOT enabled)
OpenJ9 - b0699311c7
OMR - 254af5a04
JCL - 3d1045c3ea based on jdk-11.0.23+9)
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-into-the
Даже после импорта самозаверяющего сертификата из базы данных Oracle в хранилище доверенных сертификатов он по-прежнему ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как добавить файл .crt в хранилище ключей и хранилище доверенных сертификатов
Anonymous » » в форуме JAVA - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-