sunJCE or ibmJce,was服務器下使用des的注意點

最近開發了一個應用,在tomcat下一切ok,到was上有報錯。

打開debug日誌,沒有異常??

繼續調查發現是咱們的程序引用了一個sun好久之前的jar.這個jar須要單獨打開message日誌

在一堆日誌中找到了:
java.security.NoSuchProviderException: no such provider: SunJCE
        at sun.security.jca.GetInstance.getService(GetInstance.java:82)
        at javax.crypto.b.a(Unknown Source)
        at javax.crypto.SecretKeyFactory.getInstance(Unknown Source)
        at
com.iplanet.services.util.JCEEncryption.setPassword(JCEEncryption.java:369)
        at com.iplanet.services.util.Crypt.createInstance(Crypt.java:126)
        at com.iplanet.services.util.Crypt.initialize(Crypt.java:97)
這個包裏使用了des加密,可是sun的組件,固然是使用sunJDK裏本身sunJCE 而IBM was服務器裏沒有這個sunJCE的provider,因而就 no such provider 所以,咱們只要提供這個sunjce的provider就能夠使程序正常運行而無需修改。 常規的方法,就是下載sunjce_provider.jar,修改jdk的policy,啓用這個jce(這個是jdk的安全配置,不能直接引入相應的jar包) 具體IMB的文檔參考:http://www.ibm.com/developerworks/websphere/library/techarticles/0306_yu/yu.html 不過這個sun的jar包裏卻預留了解決方案,反編譯這個jar,能夠看到sun寫這個jar的時候提供了配置項(32個贊):
 CRYPTO_DESCRIPTOR_PROVIDER = System.getProperty("amCryptoDescriptor.provider", "SunJCE");
 KEYGEN_ALGORITHM_PROVIDER = System.getProperty("amKeyGenDescriptor.provider", "SunJCE");
   
 Cipher.getInstance(CRYPTO_DESCRIPTOR, CRYPTO_DESCRIPTOR_PROVIDER)
 this.pbeKey = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM, KEYGEN_ALGORITHM_PROVIDER).generateSecret(new PBEKeySpec(paramString.toCharArray()));
而IbmJCE與SunJCE都遵循jce1.2.1規範,這裏使用是兼容的 所以只要添加應用程序的jvm參數 -DamCryptoDescriptor.provider=IBMJCE -DamKeyGenDescriptor.provider=IBMJCE,問題解決 下面是官方的說明:
https://java.net/projects/opensso/lists/dev/archive/2008-10/message/22
-DamCryptoDescriptor.provider=IBMJCE -DamKeyGenDescriptor.provider=IBMJCE
ERROR: Crypt: failed to set password-based key
java.security.NoSuchProviderException: no such provider: SunJCE


文章來源:http://blog.xujif.com/archives/sunjce-or-ibmjce.html
相關文章
相關標籤/搜索