Oracle从10gR2开始就提供了wallet,用于解决用户认证信息(用户名和密码)的存放问题,通过使用wallet可以实现无密码登录数据库,
这样一来就不需要在应用程序中嵌入数据库密码(或者在配置文件中明文存放密码),同时更加方便维护大量服务器的环境的数据库密码维护工作,
因为可以直接分发wallet文件,实现批量修改密码。
另外,如果我们在pl/sql中使用utl_http包访问需要用户名和密码的url时,也可以不用将用户名和密码嵌入代码中,而直接让其访问wallet中的认证信息,类似于
web容器中使用jndi的方式访问数据源
下面我们以windows 7 + oracle client 11.2.0.1.0环境为例,讲解具体使用方法。
注:使用oracle wallet只需安装oracle database client即可。
语法:mkstore -wrl <wallet_location> -create
D:\app\Oracle>mkstore -wrl . -create ---- wrl参数后跟wallet的存放路径,点表当前目录
Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production
版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。
输入口令: ----------输入自定义的wallet密码,该密码是打开wallet的时候需要提供的密码,与数据库密码无关
再次输入口令: ----------确认自定义的wallet密码
D:\app\Oracle>dir .
驱动器 D 中的卷没有标签。
卷的序列号是 BA8C-3377
D:\app\Oracle 的目录
2015/11/17 21:55 <DIR> .
2015/11/17 21:55 <DIR> ..
2015/11/17 21:55 3,589 cwallet.sso ---对应的wallet文件
2015/11/17 21:55 3,512 ewallet.p12 ---对应的wallet文件
2013/11/18 11:45 <DIR> Middleware
2 个文件 7,101 字节
3 个目录 14,528,782,336 可用字节
更多命令信息请输入mkstore -help查看帮助
语法:mkstore -wrl <wallet_location> -createCredential <db_connect_string> <username> <password>
D:\app\Oracle>mkstore -wrl . -createCredential 192.168.56.101_scott scott tiger ---192.168.56.101_scott为tnsnames.ora中的tns名称,scott为用户名,tiger为密码
Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production
版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。
输入 Wallet 口令: --输入第1步中创建wallet时提供的wallet密码
Create credential oracle.security.client.connect_string1
注意:这样一个tns名只能对应一个数据库用户,所以我们在名称上加了_scott后缀用于区分;如果用户名或者密码中有特殊字符,请用单引号引起来
如:mkstore -wrl /home/mseibt/pstore -createCredential 192.168.56.101_scott 'scott' tiger
加入如下参数:
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA = (DIRECTORY = D:\app\Oracle)) #第一步中创建wallet时的地址
)
SQLNET.WALLET_OVERRIDE = TRUE
D:\app\Oracle>sqlplus /@192.168.56.101_scott
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 11月 17 22:25:21 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show user;
USER 为 "SCOTT"
测试通过。
注:现在使用pl/sql developer也可以不用输入用户名和密码登录了。
D:\app\Oracle>mkstore -wrl . -listCredential Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。 输入 Wallet 口令: List credential (index: connect_string username) 1: 192.168.56.101_scott scott
D:\app\Oracle>mkstore -wrl . -modifyCredential 192.168.56.101_scott scott newpassword Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。 输入 Wallet 口令: Modify credential Modify 1
注意:只能修改用户名和密码,而不能修改db_connect_string,因为这里是把db_connect_string当作key
D:\app\Oracle>mkstore -wrl . -deleteCredential 192.168.56.101_scott Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。 输入 Wallet 口令: Delete credential Delete 1
D:\app\Oracle>mkstore -wrl . -list Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。 输入 Wallet 口令: Oracle 密钥存储条目: oracle.security.client.connect_string1 oracle.security.client.password1 oracle.security.client.username1
注意:因为我们目前只添加了一个连接信息,所以条目名都是xxxx1
D:\app\Oracle>mkstore -wrl . -viewEntry oracle.security.client.connect_string1 Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。 输入 Wallet 口令: oracle.security.client.connect_string1 = 192.168.56.101_scott
D:\app\Oracle>mkstore -wrl . -modifyEntry oracle.security.client.connect_string1 192.168.56.101_hr Oracle Secret Store Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。 输入 Wallet 口令:
注意:前面第2步中无法修改连接串的名称,使用本步中的方法就可以修改连接串的名称
对于wallect的分发和备份就很简单了,直接从操作系统上拷贝wallect的两个文件即可。
同时问题又来了,如何防止本机的wallect文件被拷贝到其它机器上呢?
从11.2版本开始,wallect新增加了一个auto_login_local 参数,通过使用这个参数,就能解决这个问题。命令如下:
D:\app\Oracle1>orapki wallet create -wallet . -pwd "welcome1" -auto_login_local Oracle PKI Tool: 版本 11.2.0.1.0 - Production 版权所有 (c) 2004, 2009, Oracle 和/或其子公司。保留所有权利。
注意:此时是使用的orakpi命令,而非mkstore命令。wallect创建好之后,维护操作就和上面的相同了。
在linux中,如果在使用的过程中抱ORA-12578: TNS:wallet open failed的错误,请检查/etc/hosts文件
确保按照如下格式配置
<IP> <HOSTNAME> [ <ALIAS> ]
且IP不能是集群环境的虚拟IP
全文完。