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.pem,google_wr2.pem),格式选择 Base64编码 ASCII,单一证书,然后点击 存储。
然后将文件上传到你的服务器对应目录下(比如:/u01/wallet/tde)。
创建 Wallet
1 | sqlplus / as sysdba |
将证书导入 Wallet
假设你已经将网站证书存放在 /u01/wallet/tde 目录下了(证书文件为 google_root.pem 和 google_wr2.pem)。那么 wallet_root 的路径就是 /u01/wallet。1
2
3
4
5
6
7mkdir -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 | BEGIN |
测试 https 请求
1 | DECLARE |
结果显示:HTTP Status Code: 200 即代表成功。
创建通用的 wallet,一劳永逸
聪明的你会发现,每次在PL/SQL存储过程中发起https请求,如果之前没有导入过目标域名对应的CA证书就会报错。每次都要重新导入到 wallet 中,特别麻烦。有没有办法一次性把市面上主流的CA证书一次性导入到 wallet 中,这样就可以一劳永逸了。
答案当然是有的,一般操作系统下都会准备好常用的证书,比如:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24mkdir -p /u01/wallet/apex_http
sudo chown -Rf oracle:oinstall /u01/wallet/apex_http
orapki wallet create -wallet /u01/wallet/apex_http -auto_login_local -pwd "YourPasswordOfWallet"
ls /u01/wallet/apex_http
# 看到 ewallet.p12 和 cwallet.sso 说明成功
cd /u01/wallet/apex_http
# 将pem证书文件进行切割,切割后的名字一般是xx123,后面逐一导入wallet
csplit -s -z /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem '/-----BEGIN CERTIFICATE-----/' '{*}'
# 循环批量导入证书
for f in xx*; do
echo "Importing $f"
orapki wallet add -wallet /u01/wallet/apex_http \
-trusted_cert -cert $f \
-pwd "YourPasswordOfWallet"
done
# 查看导入后的证书
orapki wallet display -wallet /u01/wallet/apex_http

在 pl/sql 中发起 https 请求之前进行如下设置即可:1
UTL_HTTP.set_wallet( path => 'file:/u01/wallet/apex_http');
另外,可以统一设置到 internal workspace 中。

这样在 PL/SQL 存储过程中发起 https 请求就不会再报错了。