使用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.1javax.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
相关产品推荐
相关产品推荐

