weblogic.security.internal.encryption.EncryptionServiceException: com.rsa.jsafe.JSAFE_PaddingException: Could not perform unpadding: invalid pad byte

本文内容适用于WebLogic 9.x, 10.x. 作者: BeanSoft.biz 禁止转载.

有时候,复制config.xml到其它一个WebLogic Domain下修改后启动(通常用于手动复制集群节点的操作), 或者Domain中的文件遭到了部分损坏, 那么启动过程中, 会在出现Security错误后,服务器进入强制退出状态, 一份可能的log如下所示:

<2011-6-25 下午09时57分30秒 CST> <Server subsystem failed.
Reason: java.lang.AssertionError: java.lang.reflect.InvocationTargetException
java.lang.AssertionError: java.lang.reflect.InvocationTargetException
at weblogic.descriptor.DescriptorManager$SecurityServiceImpl$SecurityProxy._invokeServiceMet
hod(DescriptorManager.java:175)
at weblogic.descriptor.DescriptorManager$SecurityServiceImpl$SecurityProxy.decrypt(Descripto
rManager.java:192)
at weblogic.descriptor.DescriptorManager$SecurityServiceImpl.decrypt(DescriptorManager.java:
114)
at weblogic.descriptor.internal.AbstractDescriptorBean._decrypt(AbstractDescriptorBean.java:
1092)
at weblogic.management.configuration.SecurityConfigurationMBeanImpl.getCredential(SecurityCo
nfigurationMBeanImpl.java:736)
Truncated. see log file for complete stacktrace
Caused By: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at weblogic.descriptor.DescriptorManager$SecurityServiceImpl$SecurityProxy._invokeServiceMet
hod(DescriptorManager.java:173)
Truncated. see log file for complete stacktrace
Caused By: weblogic.security.internal.encryption.EncryptionServiceException: com.rsa.jsafe.JSAFE_Pad
dingException: Could not perform unpadding: invalid pad byte.
at weblogic.security.internal.encryption.JSafeEncryptionServiceImpl.decryptBytes(JSafeEncryp
tionServiceImpl.java:136)
at weblogic.security.internal.encryption.JSafeEncryptionServiceImpl.decryptString(JSafeEncry
ptionServiceImpl.java:184)
at weblogic.security.internal.encryption.ClearOrEncryptedService.decrypt(ClearOrEncryptedSer
vice.java:96)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
Truncated. see log file for complete stacktrace
Caused By: com.rsa.jsafe.JSAFE_PaddingException: Could not perform unpadding: invalid pad byte.
at com.rsa.jsafe.c.a(Unknown Source)
at com.rsa.jsafe.JSAFE_SymmetricCipher.decryptFinal(Unknown Source)
at weblogic.security.internal.encryption.JSafeEncryptionServiceImpl.decryptBytes(JSafeEncryp
tionServiceImpl.java:124)
at weblogic.security.internal.encryption.JSafeEncryptionServiceImpl.decryptString(JSafeEncry
ptionServiceImpl.java:184)
at weblogic.security.internal.encryption.ClearOrEncryptedService.decrypt(ClearOrEncryptedSer
vice.java:96)
Truncated. see log file for complete stacktrace
>
<2011-6-25 下午09时57分30秒 CST> <Server state changed to FAI
LED>
<2011-6-25 下午09时57分30秒 CST> <A critical service failed. T
he server will shut itself down>
<2011-6-25 下午09时57分30秒 CST> <Server state changed to FOR
CE_SHUTTING_DOWN> </p> </td> </tr> </table>

Log中粗体的的部分显示了出错的真正原因是在JSAFE包中进行解密(decrypt)时报错, 而调用此功能的是WebLogic安全模块的解密字符串方法. JSafe是rsa公司出品的一个收费的加密解密安全相关的软件包. 后台细节不必深究, 我们只需要关注解密字符串的部分即可. 首先需要指出的是密码加密后的内容只和文件 $DOMAIN_HOME/security/SerializedSystemIni.dat 相关.

解决方法1: 修改config.xml中的加密内容.

首先, 必须找一份能正常运行的Domain文件, 然后使用 如何破解WebLogic管理密码? 中提到的解密工具, 来得到原始密码.

需要解密的config.xml中的内容如下粗体部分所示:

myrealm
(1) {AES}QIo54gGfn2Y+y62DqTCE7Q01ll5DF48PbAI1gBX22wR8sWEuVlvdHXSc9kDAfknTJGfo1n1bO/RxkYMogv4XNZ4bFTmbAe1zYfpsBtSFbzI97Y2HE3lwd5c9dv9gDISU
weblogic
(2) {AES}stQ8+dVzw1jEDpF4xj+ub1m460793ijKqI0YBhpkZNE=

….


1034
(3) {AES}OYLOL/6/sVdiwG/rkqTj8U2TdFUXIa9PgZRzWKlJqju1cVvUFKcWzqir1N4qtQHy

(1) 解密后的内容是WebLogic启动密码, (2), (3) 则为数字(似乎是随机的内容).

然后需要动用WebLogic自带的明文加密工具weblogic.security.Encrypt, 在新的Domain中得出这几个密码的新内容并替换到正确的位置中. 相关文档请访问 http://download.oracle.com/docs/cd/E11035_01/wls100/admin_ref/utils.html#wp1209592.

如果boot.properties有类似问题, 使用相同方法处理后即可.

解决方法2: 替换新Domain中的 SerializedSystemIni.dat 为能正常运行的Domain中的相同文件, 此方法步骤最简单(不推荐, 可能有安全隐患).

转载请注明:WebLogic Android 博客 » weblogic.security.internal.encryption.EncryptionServiceException: com.rsa.jsafe.JSAFE_PaddingException: Could not perform unpadding: invalid pad byte