最近有个需求是要将oracle适配https连接方式,因为我们使用的haproxy(不知道haproxy点击)所以添加如下配置记录。
HAProxy的设置
global
daemon
user haproxy
user haproxy
maxconn 4000
log 127.0.0.1 local0
log 127.0.0.1 local2 info
stats socket 你路径下的haproxy.sock mode 600 level admin
stats timeout 30s
ssl-default-bind-ciphers 加密算法
ssl-default-bind-options ssl-min-ver TLSv1.2
defaults
mode tcp
log global
retries 3
timeout queue 1m
timeout connect 10s
timeout client 8h
timeout server 8h
timeout http-keep-alive 10s
timeout check 300s
frontend ora_你的IP_in
bind *:你的端口 ssl crt 你路径下的oracle_ssl.pem
似
log global #应用全局的日志设置
default_backend ora_你的IP_默认的ORACLE端口1521或者你更改的其他的 #设置请求默认转发的后端服务池
backend ora_你的IP_默认的ORACLE端口1521或者你更改的其他的
balance roundrobin
server ora_默认的ORACLE端口1521或者你更改的其他的_1 你的IP_默认的ORACLE端口1521或者你更改的其他的 check port 默认的ORACLE端口1521或者你更改的其他的 maxconn 1000
本地调试
开通IP端口白名单
这个要想公司的运维部或者你们服务器开个白名单即可,给你本地ipconfig中的IPV6地址即可。
测试ip和端口
如果cmd没有telnet命令,在控制面板上选择即可

telnet 你的IP 你的端口
测试数据库连接
sqlplus 用户名/密码@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=你的IP)(PORT=你的端口))(CONNECT_DATA=(SERVICE_NAME=你的数据库名称)))"
JAVA连接方式
Oracle Wallet
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class OracleHAProxyWalletSSLConnection {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 加载Oracle JDBC驱动
//maven pom 配置驱动 记得maven download sources之后再处理
//<dependency>
// <groupId>com.oracle.database.jdbc</groupId>
// <artifactId>ojdbc8</artifactId>
// <version>21.7.0.0</version> <!-- 替换为你的版本 -->
// </dependency>
//
// <!-- Wallet/SSL所需依赖 -->
// <dependency>
// <groupId>com.oracle.database.security</groupId>
// <artifactId>oraclepki</artifactId>
// <version>21.7.0.0</version>
// </dependency>
// <dependency>
// <groupId>com.oracle.database.security</groupId>
// <artifactId>osdt_cert</artifactId>
// <version>21.7.0.0</version>
// </dependency>
// <dependency>
// <groupId>com.oracle.database.security</groupId>
// <artifactId>osdt_core</artifactId>
// <version>21.7.0.0</version>
// </dependency>
Class.forName("oracle.jdbc.OracleDriver");
// 配置数据库连接属性
Properties props = new Properties();
// 数据库用户名和密码
props.setProperty("user", "你的用户名");
props.setProperty("password", "你的密码");
// SSL配置
props.setProperty("oracle.net.ssl_version", "1.2");
//注释点自动匹配即可生效
//props.setProperty("oracle.net.ssl_cipher_suites", "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256");
// Wallet配置
props.setProperty("oracle.net.wallet_location", "(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=你的wallet证书地址)))");
props.setProperty("oracle.net.authentication_services", "(TCPS)");
// HAProxy代理地址和端口 (通常HAProxy会监听非SSL端口,然后转发到Oracle的SSL端口)
String proxyHost = "HAProxy下的ip";
int proxyPort = HAProxy中的端口; // HAProxy监听的端口
// 数据库服务名 (注意:通过HAProxy时可能需要使用服务名而非SID)
String serviceName = "数据库服务名";
// 构建连接URL (使用TCPS协议)
String jdbcUrl = String.format(
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SERVICE_NAME=%s)))",
proxyHost, proxyPort, serviceName
);
// 建立连接
System.out.println("正在通过HAProxy连接到Oracle数据库...");
connection = DriverManager.getConnection(jdbcUrl, props);
System.out.println("连接成功!");
// 测试查询
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT SYSDATE FROM DUAL");
if (resultSet.next()) {
System.out.println("数据库当前时间: " + resultSet.getTimestamp(1));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Java KeyStore
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class OracleHAProxyKeyStoreSSLConnection {
// 配置参数 - 根据实际环境修改
private static final String PROXY_HOST = "HAProxy主机名"; // HAProxy主机名
private static final int PROXY_PORT = HAProxy代理端口; // HAProxy代理端口
private static final String DB_SERVICE_NAME = "Oracle服务名";// Oracle服务名
private static final String KEYSTORE_PATH = "你的keystore的秘钥路径"; // 密钥库路径
private static final String KEYSTORE_PASSWORD = "你的keystore密码"; // 密钥库密码
private static final String TRUSTSTORE_PATH = "你的TRUSTSTORE的秘钥路径"; // 信任库路径
private static final String TRUSTSTORE_PASSWORD = "你的TRUSTSTORE的密码"; // 信任库密码
private static final String DB_USER = "数据库用户名"; // 数据库用户名
private static final String DB_PASSWORD = "数据库密码"; // 数据库密码
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 加载Oracle JDBC驱动
Class.forName("oracle.jdbc.OracleDriver");
// 设置系统属性用于SSL配置
System.setProperty("javax.net.ssl.keyStore", KEYSTORE_PATH);
System.setProperty("javax.net.ssl.keyStorePassword", KEYSTORE_PASSWORD);
System.setProperty("javax.net.ssl.trustStore", TRUSTSTORE_PATH);
System.setProperty("javax.net.ssl.trustStorePassword", TRUSTSTORE_PASSWORD);
// 可选:启用SSL调试信息
// System.setProperty("javax.net.debug", "ssl");
// 构建连接URL - 通过HAProxy代理连接Oracle SSL端口
String jdbcUrl = String.format(
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)" +
"(HOST=%s)(PORT=%d))(CONNECT_DATA=(SERVICE_NAME=%s)))",
PROXY_HOST, PROXY_PORT, DB_SERVICE_NAME
);
// 设置连接属性
Properties props = new Properties();
props.setProperty("user", DB_USER);
props.setProperty("password", DB_PASSWORD);
props.setProperty("oracle.net.ssl_version", "1.2"); // 指定SSL版本
props.setProperty("oracle.net.ssl_server_dn_match", "true"); // 验证服务器DN
// 建立连接
System.out.println("正在通过HAProxy连接Oracle数据库...");
connection = DriverManager.getConnection(jdbcUrl, props);
System.out.println("连接成功!");
// 测试查询 - 查看数据库版本
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT * FROM v$version WHERE rownum = 1");
if (resultSet.next()) {
System.out.println("数据库版本: " + resultSet.getString(1));
}
} catch (Exception e) {
System.err.println("连接过程中发生错误: " + e.getMessage());
e.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
System.out.println("连接已关闭");
} catch (Exception e) {
System.err.println("关闭资源时发生错误: " + e.getMessage());
}
}
}
}
5537

被折叠的 条评论
为什么被折叠?



