You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用oracle.ucp.jdbc.PoolDataSource时如何建立Oracle数据库SSL安全连接

Oracle UCP PoolDataSource 配置Oracle SSL数据库连接实现方法

以下配置基于你现有可正常运行的普通UCP连接逻辑修改即可,无需重构连接池核心代码。

前置准备

  • 提前准备好SSL证书材料:将数据库服务端的CA根证书导入客户端JKS格式信任库,若开启双向SSL认证,还需将客户端身份证书导入JKS密钥库,记录库文件的绝对路径和访问密码
  • 确认数据库端已启用TCPS协议的SSL监听,默认SSL端口为2484,提前确认客户端到该端口的网络连通性,排除防火墙、安全组拦截问题

核心配置参数说明

所有参数直接通过PoolDataSource的setConnectionProperty方法注入即可,无需修改JVM全局系统参数:

  • oracle.net.ssl_version:指定使用的TLS协议版本,生产环境固定配置为TLSv1.2或更高版本,禁止使用存在已知漏洞的SSLv3、TLSv1.0、TLSv1.1
  • javax.net.ssl.trustStore:客户端信任库的绝对路径,存储信任的数据库服务端CA根证书
  • javax.net.ssl.trustStorePassword:上述信任库的访问密码
  • 仅双向SSL认证需要配置 javax.net.ssl.keyStore:客户端密钥库的绝对路径,存储客户端身份证书
  • 仅双向SSL认证需要配置 javax.net.ssl.keyStorePassword:上述客户端密钥库的访问密码
  • oracle.net.ssl_server_dn_matching:是否校验服务端证书DN,生产环境必须设置为true,配合oracle.net.ssl_server_cert_dn参数指定数据库服务端证书的预期DN值,防范中间人攻击;测试环境可临时设置为false跳过校验
  • oracle.net.ssl_server_cert_dn:生产环境必填,填写数据库服务端证书的完整DN值

代码实现示例

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import java.sql.Connection;

public class UcpSslConnection {
    public static void main(String[] args) throws Exception {
        PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
        // 原有普通连接池的通用配置保持不变即可
        pds.setConnectionPoolName("ProdOracleSslPool");
        pds.setInitialPoolSize(5);
        pds.setMinPoolSize(5);
        pds.setMaxPoolSize(30);
        pds.setConnectionWaitTimeout(3000);
        pds.setUser("your_db_username");
        pds.setPassword("your_db_password");

        // 核心修改1:JDBC连接串使用TCPS协议,指向数据库SSL监听端口
        String sslUrl = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=your_db_host)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=your_db_service_name)))";
        pds.setURL(sslUrl);

        // 核心修改2:注入SSL连接参数
        pds.setConnectionProperty("oracle.net.ssl_version", "TLSv1.2");
        pds.setConnectionProperty("javax.net.ssl.trustStore", "/opt/config/truststore.jks");
        pds.setConnectionProperty("javax.net.ssl.trustStorePassword", "your_truststore_pwd");
        // 生产环境开启证书DN校验
        pds.setConnectionProperty("oracle.net.ssl_server_dn_matching", "true");
        pds.setConnectionProperty("oracle.net.ssl_server_cert_dn", "CN=oracle-prod,OU=db,O=yourcompany,L=beijing,ST=beijing,C=cn");

        // 双向SSL场景追加以下两行配置
        // pds.setConnectionProperty("javax.net.ssl.keyStore", "/opt/config/keystore.jks");
        // pds.setConnectionProperty("javax.net.ssl.keyStorePassword", "your_keystore_pwd");

        // 测试连接
        try (Connection conn = pds.getConnection()) {
            System.out.println("SSL database connection established successfully");
        }
    }
}

常见问题排查

  • 若报SSL握手失败错误,优先检查ojdbc驱动版本,必须使用和数据库大版本匹配的ojdbc8及以上版本驱动,旧版ojdbc驱动对高版本TLS协议兼容存在缺陷
  • 连接串必须指定PROTOCOL=TCPS,误写为普通TCP协议会直接导致SSL协商失败
  • 容器、云主机部署场景下,提前确认信任库、密钥库文件的挂载路径正确,应用运行用户对文件有读取权限
  • 不要图省事在生产环境关闭服务端证书校验,会完全失去SSL链路的安全防护能力

内容的提问来源于stack exchange,提问作者Chandu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:45:37