Oracle Wallet 钱包配置

Oracle Wallet 是一种安全容器,用于安全地存储敏感信息,如加密密钥、证书、凭据等,在 Oracle 安全体系中扮演着核心角色。本文主要侧重于介绍如何在 Linux 下配置 Oracle Wallet,以便可以通过 utl_http 发起 https 请求(以访问 https://www.google.com 为例)。

Wallet 的主要作用

功能场景说明
1. TDE(Transparent Data Encryption)存储主加密密钥(master encryption key),用于加密/解密表或表空间的数据。Wallet 是 TDE 启动的前提。
2. Oracle Auto-Login(自动登录 Wallet)实现数据库启动时无需手动输入密码即可访问加密内容(常用于无人值守环境)
3. Oracle Secure External Password Store(SEPS)允许将数据库连接口令以加密形式存储在 Wallet 中,避免将密码暴露在脚本或配置文件中
4. SSL/TLS 证书存储存放数据库访问其他服务(如 Web Service、SMTP、LDAP)时所需的客户端证书或信任根证书
5. Oracle GoldenGate / Data Pump 等工具集成在传输加密数据时,利用 Wallet 中的密钥对数据进行加解密
6. Database Link 密码加密(12c+)Wallet 支持存储加密后的数据库链接口令(密钥在 Wallet 中),提高 DBLink 安全性

Wallet 的类型

类型说明
Standard Wallet (ewallet.p12)手动加载,需要口令打开
Auto-Login Wallet (cwallet.sso)自动加载,无需口令(适用于无人值守环境)
Local Auto-Login Wallet与特定服务器绑定,不能跨主机使用
Password-Protected Wallet仅在手动输入密码后才能访问

通常实际部署中,开发/测试环境用 auto-login,生产环境使用手动 wallet 并设置安全策略。

Wallet 配置步骤

下载网站证书

首先需要打开浏览器,访问 https://www.google.com 下载网站证书。点击浏览器地址栏左上角的锁图标,选择 连接安全 > 证书有效

点击 详细信息,选择相应的节点,点击 导出 按钮。

钢哥提醒:这里仅分别导出前两个证书即可,不要导出最后一个。

重命名证书名称(如:google_root.pemgoogle_wr2.pem),格式选择 Base64编码 ASCII,单一证书,然后点击 存储

然后将文件上传到你的服务器对应目录下(比如:/u01/wallet/tde)。

创建 Wallet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sqlplus / as sysdba

SHOW PARAMETER WALLET_ROOT; -- 查看 Wallet 路径
SHOW PARAMETER TDE_CONFIGURATION; -- 查看 Wallet 类型
SHOW PARAMETER spfile; -- 查看 spfile 路径

/*
-- 通过 SQL 查看数据库参数
SELECT
(SELECT value FROM v$parameter WHERE name = 'wallet_root') AS wallet_root,
(SELECT value FROM v$parameter WHERE name = 'tde_configuration') AS tde_config,
(SELECT value FROM v$parameter WHERE name = 'spfile') AS spfile_path
FROM dual;
*/

ALTER SYSTEM SET WALLET_ROOT='/u01/wallet' SCOPE=SPFILE; -- 设置 Wallet 路径 (需要重启数据库)

shutdown immediate
startup

ALTER SYSTEM SET TDE_CONFIGURATION='KEYSTORE_CONFIGURATION=FILE' SCOPE=SPFILE; -- 设置 Wallet 类型 (需要重启数据库)

shutdown immediate
startup

将证书导入 Wallet

假设你已经将网站证书存放在 /u01/wallet/tde 目录下了(证书文件为 google_root.pemgoogle_wr2.pem)。那么 wallet_root 的路径就是 /u01/wallet

1
2
3
4
5
6
7
mkdir -p /u01/wallet

chmod -R 777 /u01/wallet

orapki wallet create -wallet /u01/wallet/tde -auto_login -pwd 'YourPasswordOfWallet'
orapki wallet add -wallet /u01/wallet/tde -trusted_cert -cert "/u01/wallet/tde/google_root.pem" -pwd 'YourPasswordOfWallet'
orapki wallet add -wallet /u01/wallet/tde -trusted_cert -cert "/u01/wallet/tde/google_wr2.pem" -pwd 'YourPasswordOfWallet'

配置 ACL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
BEGIN
-- 1. 创建 ACL
dbms_network_acl_admin.create_acl(
acl => 'google_acl.xml',
description => 'Allow access to Google',
principal => 'APEXCN', -- 需要发起https的PDB用户名
is_grant => TRUE,
privilege => 'connect'
);

-- 2. 添加 resolve 权限(解析域名需要)
dbms_network_acl_admin.add_privilege(
acl => 'google_acl.xml',
principal => 'APEXCN',
is_grant => TRUE,
privilege => 'resolve'
);

-- 3. 分配 ACL 到指定主机
dbms_network_acl_admin.assign_acl(
acl => 'google_acl.xml',
host => 'www.google.com', -- 主机名
lower_port => 443, -- 443 端口
upper_port => 443
);

COMMIT;
END;

测试 https 请求

1
2
3
4
5
6
7
8
9
10
DECLARE
lo_req utl_http.req;
lo_resp utl_http.resp;
BEGIN
utl_http.set_wallet('file:/u01/wallet/tde'); -- 设置 Wallet 路径
lo_req := utl_http.begin_request('https://www.google.com/'); -- 发起 https 请求
lo_resp := utl_http.get_response(lo_req); -- 获取响应
dbms_output.put_line('HTTP Status Code: ' || lo_resp.status_code); -- 打印状态码
utl_http.end_response(lo_resp); -- 关闭连接
END;

结果显示:HTTP Status Code: 200 即代表成功。