Oracle Wallet 是 Oracle 提供的加密凭证存储机制,本质是受口令保护的加密文件(或目录),用于安全存放数据库连接凭据、SSL 证书等敏感信息,避免明文密码泄露。
Oracle Wallet 是什么,为什么它能替代明文密码
wallet 是 oracle 提供的加密凭证存储机制,本质是一个受口令保护的加密文件(或目录),用于安全存放数据库连接凭据、ssl 证书等敏感信息。它不把密码存进存储过程、包变量或参数文件,而是让 utl_http、utl_smtp、db link 等组件在运行时按需解密获取——这意味着即使 dba 查看源码,也看不到密码字符串。
- Wallet 文件本身是二进制格式,无法直接读取凭据内容
- 连接时 Oracle 客户端(如 OCI)自动调用 Wallet,无需修改应用逻辑
- 支持 TNS alias 映射 + 自动认证,对 PL/SQL 调用完全透明
创建并配置 Oracle Wallet 的关键步骤
Wallet 必须在数据库服务器上创建,并由 Oracle 进程(如 oracle 用户)有读取权限;客户端和服务器共用同一 Wallet 时,路径必须一致且被 sqlnet.ora 正确指向。
- 使用
orapki wallet create命令生成 Wallet,必须加-auto_login(否则每次连接都要输口令,PL/SQL 不支持交互式输入) - 用
mkstore添加数据库别名和凭据:mkstore -wrl /path/to/wallet -createCredential mydb_alias username password - 确保
sqlnet.ora包含两行:WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /path/to/wallet)))和SQLNET.WALLET_OVERRIDE = TRUE - Wallet 目录权限必须为 700,属主为运行 Oracle 实例的用户(如
oracle:oinstall),否则ORA-28759: failure to open file
在 PL/SQL 中使用 Wallet 配置的 DB Link 或 UTL_HTTP
Wallet 不改变语法,只改变“凭据来源”。只要 TNS alias 在 tnsnames.ora 中定义,并在 Wallet 中注册了对应凭据,所有基于该 alias 的连接都自动启用 Wallet 认证。
- 创建 DB Link 时,直接引用 TNS alias:
CREATE DATABASE LINK remote_db CONNECT TO username IDENTIFIED BY VALUES 'mydb_alias';—— 注意这里IDENTIFIED BY VALUES表示从 Wallet 取凭据,不是明文密码 - 使用
UTL_HTTP调用需要认证的 HTTP 接口时,只要目标 URL 对应的域名/IP 已在 Wallet 中配置 SSL 证书(用orapki wallet add),就能跳过证书校验错误 - 若遇到
ORA-24247: network access denied by access control list (ACL),说明 Wallet 解密成功但网络 ACL 未放行,需单独配置DBMS_NETWORK_ACL_ADMIN
常见失败原因和绕不过去的细节
Wallet 看似简单,但实际部署中 80% 的问题出在路径、权限或环境变量错位。
-
sqlnet.ora必须放在 $ORACLE_HOME/network/admin 下,且被监听器和数据库进程同时读到;若用 Oracle Restart 或 RAC,每个节点都要单独配 - Wallet 路径不能用符号链接,必须是绝对物理路径;
$ORACLE_HOME环境变量在后台作业(如 DBMS_SCHEDULER)中可能为空,建议硬编码完整路径 - 修改 Wallet 后,必须重启监听器(
lsnrctl reload)和数据库会话(已有连接不会自动加载新凭据) - 测试是否生效最直接的方式:用
sqlplus /@mydb_alias(不输用户名密码)能否连通;如果失败,立刻检查sqlnet.log,里面会有 Wallet 加载失败的具体提示
Wallet 本身不解决“谁可以读 Wallet 文件”这个问题——它只是把密码从代码里挪到一个需要 OS 权限控制的文件里。真正安全的前提,是操作系统层面的严格隔离。











