当我在Glassfish V2.1 Patch02群集上部署JSF应用程序时,加载第一页时会抛出以下异常。
java.security.ProviderException: update() failed
at sun.security.pkcs11.P11Cipher.implUpdate(P11Cipher.java:557)
at sun.security.pkcs11.P11Cipher.engineUpdate(P11Cipher.java:457)
at sun.security.pkcs11.P11Cipher.engineDoFinal(P11Cipher.java:485)
at sun.security.pkcs11.P11Cipher.engineDoFinal(P11Cipher.java:471)
at javax.crypto.Cipher.doFinal(DashoA13*..)
...
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DEVICE_ERROR
at sun.security.pkcs11.wrapper.PKCS11.C_EncryptUpdate(Native Method)
at sun.security.pkcs11.P11Cipher.implUpdate(P11Cipher.java:510)
我在我的应用程序中没有使用任何类型的加密/解密。
当我搜索此异常时,我发现this是在应用程序中加载密码时的情况。
我想知道Glassfish / JSF是否加载了导致此异常的默认密码?
如果没有,可能的原因和解决方案是什么?
答案 0 :(得分:1)
问题已经解决。问题是这个“小问题” - https://issues.apache.org/jira/browse/MYFACES-1786
解决方案是将以下条目放在web.xml中以禁用状态管理加密并将状态保存切换到服务器
<context-param>
<param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
根据我的经验,在Websphere(独立或群集)中使用'default'启用加密(即在web.xml中没有org.apache.myfaces.USE_ENCRYPTION条目)部署的应用程序完全正常。
但是应用程序没有部署在Glassfish集群或Tomcat 6中(问题在线程中定义 - nabble.com/BadPadding-Exception-and-more-td21984713.html)
答案 1 :(得分:0)
我能想到基础JSF实现可能使用加密的唯一地方是state management。组件树是有状态的,因此它在会话或隐藏表单字段(由javax.faces.STATE_SAVING_METHOD
init参数设置)中的请求之间保留。如果使用隐藏的表单字段,则加密它是明智的,以防止黑客重写服务器状态。 (请注意,JSF中的状态管理是可插入的,因此第三方库可以替换默认行为。如果您使用的是丰富的组件库,则值得检查文档。)
答案 2 :(得分:0)
您可以尝试在非群集glassfish或tomcat中部署您的应用程序,看看您是否遇到相同的情况。然后,您将知道问题是您的应用程序还是应用程序服务器或群集的配置。