如何使用SSL实现cx_Oracle数据库连接加密?
cx_Oracle 连接加密状态校验及SSL配置方案
1 校验现有连接是否加密
你可以在建立连接后执行以下SQL查询当前连接的传输协议,判断是否已加密:
import cx_Oracle dsn = cx_Oracle.makedsn(host='127.0.0.1', port=1521, sid='your_sid') conn = cx_Oracle.connect(user='your_username', password='your_password', dsn=dsn) # 执行查询验证加密状态 cursor = conn.cursor() cursor.execute(""" SELECT network_service_banner FROM v$session_connect_info WHERE sid = SYS_CONTEXT('USERENV', 'SID') """) for banner in cursor: print(banner[0]) cursor.close() conn.close()
如果返回结果包含 TCP/IP with SSL 说明连接已加密,返回 TCP/IP 则为明文传输需要配置SSL。
2 配置SSL加密连接
前置要求
Oracle服务端已完成SSL监听配置,你已获取到服务端信任钱包文件(通常为cwallet.sso自动登录钱包文件,无需额外输入钱包密码)。
配置步骤
- 将钱包文件存放到本地指定目录,比如
/home/your_user/oracle_wallet/ - 修改cx_Oracle连接代码,新增SSL相关参数,示例如下:
import cx_Oracle # 构造带SSL参数的DSN dsn = cx_Oracle.makedsn( host='127.0.0.1', port=2484, # Oracle SSL默认监听端口,需和服务端配置一致 sid='your_sid', protocol='tcps' # 指定使用TCPS加密协议 ) # 连接时传入钱包路径参数 conn = cx_Oracle.connect( user='your_username', password='your_password', dsn=dsn, encoding='UTF-8', nencoding='UTF-8', # 钱包路径参数,cx_Oracle 8.0及以上版本支持直接传入 wallet_location='/home/your_user/oracle_wallet/' ) # 验证加密状态 cursor = conn.cursor() cursor.execute("SELECT network_service_banner FROM v$session_connect_info WHERE sid = SYS_CONTEXT('USERENV', 'SID')") for banner in cursor: if 'TCP/IP with SSL' in banner[0]: print('连接已加密') cursor.close() conn.close()
常见异常排查
如果连接报错,可优先检查以下配置:
- 服务端SSL监听端口是否开放,本地网络是否可通
- 钱包文件权限是否正确,程序运行用户有读取权限
- cx_Oracle版本是否在7.3以上,低于该版本建议先升级模块
内容的提问来源于stack exchange,提问作者Suji
相关产品推荐
相关产品推荐

