相信作過oracle中間件的同窗確定都會遇到這樣的狀況java
項目就像流水同樣永不停息,每一個項目又有多套環境,每一個環境又有超級多的服務器,就產生了超級多的密碼,程序員又懶又自負,自覺得能記住全部密碼,結果每每是悲劇的,幸運的是weblogic幫咱們記住了全部的密碼,雖然是加密的,但因爲weblogic自己也要使用密碼進行驗證,所以加密必然是可逆的,這篇文檔介紹如何進行解密。程序員
在weblogic後臺配置文件中,有不少是包含密碼的,好比boot.properties,config.xml
等,這些密碼都被加密過,你看到的形式爲{AES}xxxxxx
都是密碼。web
解密關鍵步驟是拿到密鑰,weblogic密鑰位於${DOMAIN_HOME}/security/SerializedSystemIni.dat
中,好比/u01/Middleware/user_projects/domains/portal_domain/security/SerializedSystemIni.dat
,該文件是一個64字節的二進制文件,每一個domain都有一個這個文件。數據庫
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); } }
程序須要兩個依賴包bash
這兩個依賴包能夠從weblogic後臺下載,路徑以下服務器
若是沒有wlfullclient.jar須要自行構建,構建方法以下oracle
[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工具,有更簡單的方法,以下dom
[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進行編碼輸出,而後本地解碼便可。ui
$ base64 SerializedSystemIni.dat BMeCNZwCIIzxxxxxxxxxxxxxx==
複製到本地文件base64.txt,也執行base64命令進行解碼
base64 -Di base64 >SerializedSystemIni.dat
這樣咱們就得到了密鑰文件