oracle 19c外部口令存储需同时满足三条件:服务端sqlnet.ora中sqlnet.authentication_services=(external)、wallet_location设绝对路径且目录权限700、客户端shell重载环境;缺一即ora-28759或密码错误。

Oracle 19c 默认不启用外部口令存储,sqlplus / @db 报密码错误不是 wallet 没建好,而是数据库服务端根本没允许走 EXTERNAL 认证路径——必须同时满足服务端配置、客户端环境加载、权限与路径三重条件,缺一不可。
SQLNET.AUTHENTICATION_SERVICES 必须设为 (EXTERNAL)
这是开启外部口令认证的开关,只在服务端 $ORACLE_HOME/network/admin/sqlnet.ora 中生效(注意:不是实例目录下的 sqlnet.ora):
-
SQLNET.AUTHENTICATION_SERVICES = (EXTERNAL)—— 必须显式写这行,不能留空或注释掉 - 不能混用
(TCPS, EXTERNAL)等多协议,除非你真需要 SSL + wallet 双模,否则只留(EXTERNAL)最稳妥 - 该参数对监听器和数据库进程都起作用;改完无需重启监听或实例,但客户端 shell 必须新开或重载环境(比如
source ~/.bash_profile),否则sqlplus / @db仍走本地 OS 认证
WALLET_LOCATION 路径必须绝对、可读、无软链
WALLET_LOCATION 是 Oracle 查找 wallet 的唯一依据,它不解析环境变量、不跟随软链接、不 fallback 到其他位置:
- 正确写法:
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/app/oracle/admin/ORCL/wallet))) - 路径必须是绝对路径,
$ORACLE_HOME、~、../wallet全部无效 - 目录权限必须为
700,属主为运行 Oracle 进程的用户(通常是oracle:oinstall);755会导致ORA-28759: failure to open file - 软链接路径(如
/opt/oracle/wallet_link)会被拒绝,必须指向真实目录
mkstore 添加凭据时别写错顺序或带 @ 符号
mkstore 是纯文件操作工具,不连接数据库,也不解析 TNS 别名中的 @ —— 写错就会报 ORA-12154 这类误导性错误:
- 正确命令:
mkstore -wrl "/u01/app/oracle/admin/ORCL/wallet" -createCredential ORCL myuser mypass - 三个参数顺序固定:Wallet 路径、TNS 别名(对应
tnsnames.ora中的条目名)、用户名、密码 - 别在命令里加
@ORCL或myuser/mypass@ORCL,mkstore根本不认连接串 - 确保
tnsnames.ora中已有ORCL条目,且能tnsping ORCL通;wallet 本身好坏和网络连通性无关
自动登录 wallet 必须用 -auto_login 创建
PL/SQL、DB Link、UTL_HTTP 等场景无法交互输密,所以 wallet 必须支持无口令打开:
- 创建时必须加
-auto_login:orapki wallet create -wallet "/path" -pwd "xxx" -auto_login - 成功后目录下应有
cwallet.sso(自动登录版)和ewallet.p12(需口令版),只有前者能让sqlplus / @ORCL静默通过 - 别用 GUI 工具或手动复制 wallet 文件,
cwallet.sso是二进制加密文件,损坏即失效 - 如果后续改过 wallet 密码,必须重新用
orapki重建,mkstore不会更新cwallet.sso的主密钥
最容易被忽略的是:服务端 sqlnet.ora 配置了,但客户端 shell 没重载,或者 wallet 目录权限是 755 却以为“能 ls 就算有权限”——Oracle 对 wallet 安全要求极严,任何宽松都会直接拒绝访问,不会给模糊提示。











