Oracle DG SSL加密必须主备库双向独立配置TCPS监听、Wallet和sqlnet.ora,缺一不可;单侧配置会静默降级为明文TCP,因LOG_ARCHIVE_DEST_n未显式指向TCPS协议时自动fallback至TCP,且Easy Connect不支持TCPS。

必须主备库双向独立配置 TCPS 监听 + Wallet + sqlnet.ora,缺一不可;单侧配置会静默降级为明文 TCP,抓包可见未加密流量。
为什么 LOG_ARCHIVE_DEST_n 指向 TCPS 却还是走明文?
Oracle Data Guard 日志传输(ARCH/LGWR)走的是 Oracle Net 连接,不是内部进程通信。只要 LOG_ARCHIVE_DEST_n 中的地址没明确指向 TCPS 协议,就会 fallback 到 TCP。
- 错误写法:
LOG_ARCHIVE_DEST_2='service=orcldg async ...'—— service 别名若解析为(PROTOCOL=TCP),哪怕监听器同时开了 TCPS,也完全不生效 - 正确写法:必须用完整 DESCRIPTION,显式指定
(PROTOCOL=TCPS)和对应端口,例如:LOG_ARCHIVE_DEST_2='ASYNC NOREGISTER VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcldg SERVICE=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=standby-host)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=orcldg)))' - Easy Connect(如
host:port/service_name)完全不支持 TCPS,强行使用会报ORA-12547: TNS:lost contact或直接连接失败
Wallet 和证书为什么总报 ORA-29024?
证书验证失败几乎全是 DN(Distinguished Name)不匹配或 Wallet 权限/路径问题,不是密码错。
- 主库和备库必须各自生成 Wallet,不能拷贝复用;备库证书的
-dn必须是自身主机名(hostname -f输出),不能照抄主库命令 - Wallet 目录权限必须是
700,属主oracle:oinstall;含空格或中文的路径在listener.ora中必须加双引号,否则监听器静默忽略该 ADDRESS - 自签名场景下,需执行
orapki wallet add_trusted_cert将自身证书导入为可信根,否则握手时校验失败 -
sqlnet.ora中的WALLET_LOCATION必须写绝对路径,大小写、斜杠方向都要一致;它不继承环境变量,也不认$ORACLE_HOME或~
如何验证 SSL 加密是否真正在工作?
不能只看监听器状态或参数配置,要分层确认:
- 监听器层面:
lsnrctl status输出中必须有tcps://:1522且状态为READY;lsnrctl services中对应服务应显示Service "orcldg" has 1 instance(s). Instance "orcldg", status READY,且协议列为TCPS - 数据库层面:在主库执行
ALTER SYSTEM ARCHIVE LOG CURRENT后,查v$archive_dest_status的STATUS应为VALID,ERROR字段为空;v$managed_standby中PROCESS=ARCH或LGWR的CLIENT_PROCESS应为TCPS - 网络层面:在主库或中间节点抓包(如
tcpdump -i any port 1522 -w dg_ssl.pcap),用 Wireshark 打开后查看 TLS 握手流程(Client Hello / Server Hello),确认无明文重做日志字段
最容易被忽略的是:DG 场景下,主库和备库各自的 listener.ora 都要独立添加 (PROTOCOL=TCPS) ADDRESS,且端口不能复用(比如主库 TCP=1521、TCPS=1522,备库也得配自己的 TCPS 端口,不能指望连过去再协商加密);Wallet 文件不自动同步,证书 DN 必须匹配备库真实主机名——这两点出错,现象都是归档卡住、ALERT 日志里只有模糊的连接中断,没有明确报错。


















