oracle.jdbc.driver.OracleDriver。 IO 错误:尝试将 liquibase 连接到 Oracle RDS 时出现 IO 错误 一般 SSLEngine 问题

Posted

技术标签:

【中文标题】oracle.jdbc.driver.OracleDriver。 IO 错误:尝试将 liquibase 连接到 Oracle RDS 时出现 IO 错误 一般 SSLEngine 问题【英文标题】:oracle.jdbc.driver.OracleDriver. IO Error: IO Error Genearal SSLEngine problem when trying to connect liquibase to Oracle RDS 【发布时间】:2022-01-20 04:53:43 【问题描述】:

我开发了 liquibase maven 项目,它通过 changelog.sql 文件更新 Oracle RDS 数据库模式。 它在本地环境中成功运行,但是当我尝试在开发环境中将它部署在竹子上时,SSL 连接失败并显示以下消息。

[Error] liquibase.exeception.DatabaseException: liquibase: Connection could not be created to jdbc:oracle:thin@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=xyz.us-east1.rds.amazon.com)(PORT=2145))(CONNECT_DATA=(SID=OYKXXX1X)))?useSSL=true&requireSSL=true&verifyServerCertificate=true with driver oracle.jdbc.driver.OracleDriver. IO Error: IO Error General SSLEngine problem, connect lapse 20 ms., Authentication lapse 0ms.

下面是我的 liquibase.properties shell 文件

cat <<eof > $bamboo_result_artifactId-bamboo_result_versin/src/main/resources/liquibase.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=xyz.us-east1.rds.amazon.com)(PORT=2145))(CONNECT_DATA=(SID=OYKXXX1X)))?useSSL=true&requireSSL=true&verifyServerCertificate=true
username=xyz1234
password=ABC_22323_XYZ
changeLogFile=src/main/resources/db/chagelog/db.changelog-master.yml
eof

我已经硬编码了用户名和密码来测试 liquibase 与 Oracle RDS 数据库的连接。 请求在这方面帮助我。

【问题讨论】:

【参考方案1】:

问题出现在您的网址中。请检查您是否在 liquibase.properties 文件中输入了正确的 url。用法应该是这样的:

JDBC:oracle:thin:@host[:port]/database

在您的情况下,您的网址可能如下所示:

jdbc:oracle:thin@xyz.us-east1.rds.amazon.com:2145/OYKXXX1X?useSSL=true&requireSSL=true&verifyServerCertificate=true

【讨论】:

我尝试使用您的格式的 Oracle Aws RDS 链接,但同样的问题。不知何故,我想设置我目前没有得到的证书路径【参考方案2】:

最后,我需要将代码结构从 Maven liquibase 更改为 Spring-boot liquibase 项目,并且我能够成功建立 liquibase 到 RDS SSL 的连接。

package com.lmig.grs.springliquibase;

import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Objects;

@Configuration
public class SSLConfiguration 

    public static final String JAVAX_NET_SSL_TRUST_STORE = "javax.net.ssl.trustStore";
    public static final String JAVAX_NET_SSL_TRUST_STORE_PASSWORD = "javax.net.ssl.trustStorePassword";
    public static final String JAVAX_NET_SSL_TRUST_STORE_TYPE = "javax.net.ssl.trustStoreType";
    public static final String JAVAX_NET_SSL_KEY_STORE = "javax.net.ssl.keyStore";
    public static final String JAVAX_NET_SSL_KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword";
    public static final String JAVAX_NET_SSL_KEY_STORE_TYPE = "javax.net.ssl.keyStoreType";
    public static final String ORACLE_NET_SSL_SERVER_DN_MATCH = "oracle.net.ssl_server_dn_match";
    public static final String JKS = "JKS";
    public static final String PASSWORD = "changeit";
    public static final String KS_FILE_NAME = "clientkeystore";

    @PostConstruct
    private void configureSSL() throws URISyntaxException 
        URL clientKeystoreUrl = SSLConfiguration.class.getClassLoader().getResource(KS_FILE_NAME);
//        LOGGER.info(String.format("Classloader.clientkeystore [%s]", clientKeystoreUrl));
        final File tempKeystore = new File((Objects.requireNonNull(clientKeystoreUrl)).getFile());

        System.setProperty(JAVAX_NET_SSL_TRUST_STORE, tempKeystore.getAbsolutePath());
        System.setProperty(JAVAX_NET_SSL_TRUST_STORE_PASSWORD, PASSWORD);
        System.setProperty(JAVAX_NET_SSL_TRUST_STORE_TYPE, JKS);
        System.setProperty(JAVAX_NET_SSL_KEY_STORE, tempKeystore.getAbsolutePath());
        System.setProperty(JAVAX_NET_SSL_KEY_STORE_PASSWORD, PASSWORD);
        System.setProperty(JAVAX_NET_SSL_KEY_STORE_TYPE, JKS);
        System.setProperty(ORACLE_NET_SSL_SERVER_DN_MATCH, "true");
    

【讨论】:

以上是关于oracle.jdbc.driver.OracleDriver。 IO 错误:尝试将 liquibase 连接到 Oracle RDS 时出现 IO 错误 一般 SSLEngine 问题的主要内容,如果未能解决你的问题,请参考以下文章