NoSuchAlgorithmException:算法HmacSHA1不可用

itadok:

看下面的java行:

Mac.getInstance("HmacSHA1");

如果将其放在一个简单的测试程序中,则它可以在服务器上正常运行。但是,如果我在容器中使用此行,则会得到

java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
  at javax.crypto.Mac.getInstance(DashoA13*..)

两种情况下都使用相同的JDK安装。

搜寻了一下之后,我通过做两件事设法使其工作:

  1. sunjce_provider.jar复制$JAVA_HOME/jre/lib/ext到容器的lib目录。
  2. 在我的代码中添加以下行:

    java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());

具体来说,这是我在Apache James邮箱中发生的,但是我很确定这与JVM选项有关。这是它使用的启动脚本

尽管我最终使它起作用了,但是该解决方案感觉太黑了,无法成为正确的解决方案。我将对正在发生的事情以及更“正确”的解决方案进行解释,这将不胜感激。

相关问题使用Java加密会导致NoSuchAlgorithmException但是,在这种情况下,我非常确定应该立即支持HmacSHA1算法。可以证明,这在测试程序中没有问题。

托马斯·波宁(Thomas Pornin):

启动脚本将设置java.ext.dirs为自己的目录集(特定于应用程序),但省略了驻留的“普通”扩展目录($JAVA_HOME/jre/lib/ext/sunjce_provider.jar这说明了您的第一点(将Jar文件复制到lib目录中使其再次可见)。这很容易复制。

关于第二点,我认为这是由于启动脚本使用该-Djava.security.policy选项设置的策略文件某些提供程序是否可用取决于策略文件。默认策略文件使SunJCE提供程序可用,但是由于启动脚本要求使用非默认的自定义策略文件,因此一切正常。我建议您看一下该策略文件。

例如,在我的系统(Ubuntu Linux,Ubuntu打包的Sun JVM 1.6.0_20)上,默认策略文件位于其中,/etc/java-6-sun/security/java.security并且(其中包括)以下几行:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC

定义默认情况下应提供哪些提供程序。从您的症状来看,我认为除非明确注册,否则自定义策略文件将使SunJCE不可用(这是可以理解的,因为启动脚本还删除了对包含SunJCE的Jar文件的访问...)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章