背景
置信做过 oracle 中间件的同学必定都会遇到这样的状况
- 遗记 weblogic 管理员明码
- 遗记数据库 schema 明码
我的项目就像流水一样永不平息,每个我的项目又有多套环境,每个环境又有超级多的服务器,就产生了超级多的明码,程序员又懒又自负,自认为能记住所有明码,后果往往是喜剧的,侥幸的是 weblogic 帮咱们记住了所有的明码,尽管是加密的,但因为 weblogic 自身也要应用明码进行验证,因而加密必然是可逆的,这篇文档介绍如何进行解密。
在 weblogic 后盾配置文件中,有很多是蕴含明码的,比方 boot.properties,config.xml
等,这些明码都被加密过,你看到的模式为 {AES}xxxxxx
都是明码。
过程
解密关键步骤是拿到密钥,weblogic 密钥位于 ${DOMAIN_HOME}/security/SerializedSystemIni.dat
中,比方/u01/Middleware/user_projects/domains/portal_domain/security/SerializedSystemIni.dat
,该文件是一个 64 字节的二进制文件,每个 domain 都有一个这个文件。
- 本地创立一个新的目录(如 /workspace/secret/,把密钥文件 SerializedSystemIni.dat 下载到该目录下
- 执行以下代码,获取明码明文
package com.definesys.weblogic;
import java.io.*;
import weblogic.security.internal.*;
import weblogic.security.internal.encryption.*;
/**
* @Description:
* @author: jianfeng.zheng
* @since: 2020/9/4 1:43 下午
* @history: 1.2020/9/4 created by jianfeng.zheng
*/
public class Cracker {public static void main(String[] args) {
String secretDirectory = "/workspace/secret/";
String password = "{AES}3lQ83x6dp5ZdmtCbLOs+5E8o48nfOK2na5TZD6oMrvi9L5fTbHk+VE6A9bn4xIXl";
ClearOrEncryptedService ces = new ClearOrEncryptedService(SerializedSystemIni.getEncryptionService(new File(secretDirectory).getAbsolutePath()));
String pwd = ces.decrypt(password);
System.out.println(pwd);
}
}
- secretDirectory:密钥所在目录
- password:加密后的明码
依赖包
程序须要两个依赖包
- wlfullclient.jar
- cryptoj.jar
这两个依赖包能够从 weblogic 后盾下载,门路如下
- $WL_HOME/server/lib/wlfullclient.jar 如:/u01/Middleware/wlserver_10.3/server/lib/wlfullclient.jar
- $WL_HOME/server/lib/cryptoj.jar 如:/u01/Middleware/wlserver_10.3/server/lib/cryptoj.jar
如果没有 wlfullclient.jar 须要自行构建,构建办法如下
[oracle]$ cd /u01/Middleware/wlserver_10.3/server/lib
[oracle]$ java -jar /u01/Middleware/modules/com.bea.core.jarbuilder_1.7.0.0.jar
肯定要在 server/lib 目录下构建
更不便的办法
如果有服务器后盾权限,借助 wlst 工具,有更简略的办法,如下
[oracle]$ cd /data/Middleware/wlserver_10.3/common/bin
[oracle]$ ./wlst.sh
...
Type help() for help on available commands
wls:/offline> domain = "/data/Middleware/user_projects/domains/portal_domain"
wls:/offline> service = weblogic.security.internal.SerializedSystemIni.getEncryptionService(domain)
wls:/offline> encryption = weblogic.security.internal.encryption.ClearOrEncryptedService(service)
wls:/offline> print encryption.decrypt("{AES}1nZiIY0Fb1BckEaX7F/3V3MR+io2/dxJUfoUm3iH13S=")
这里输入明码
总结就是登录 wlst 后,执行以下语句,批改为特定环境的 domain 门路和须要解密的明码即可
domain = "/data/Middleware/user_projects/domains/portal_domain"
service = weblogic.security.internal.SerializedSystemIni.getEncryptionService(domain)
encryption = weblogic.security.internal.encryption.ClearOrEncryptedService(service)
print encryption.decrypt("{AES}1nZiIY0Fb1BckEaX7F/3V3MR+io2/dxJUfoUm3iH13S=")
彩蛋
某个我的项目没有后盾权限,但有 jenkins 权限,而且 jenkins 权限还比拟大,能够配置 job,那么这种状况下要怎么拿到明码呢,外围就是要拿到密码文件和密钥文件,密码文件比较简单在 jenkins 上配个 job 间接输入即可,但密钥文件 SerializedSystemIni.dat 是个二进制文件,当作文本输入就会乱码,能够用 base64 进行编码输入,而后本地解码即可。
- 用 jenkins 在服务器上执行 base64 命令将密钥文件以文本模式输入
$ base64 SerializedSystemIni.dat
BMeCNZwCIIzxxxxxxxxxxxxxx==
复制到本地文件 base64.txt,也执行 base64 命令进行解码
base64 -Di base64 >SerializedSystemIni.dat
这样咱们就取得了密钥文件