Oracle的SSL设置

        最近有个需求是要将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());
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值