当前位置: 首页 > 面试题库 >

NoSuchAlgorithmException:算法HmacSHA1不可用

农飞翔
2023-03-14
问题内容

看下面的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.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文件的访问…)。



 类似资料:
  • 我有java 1.4版本的代码,我们有一个新的要求,比如从另一个webservice响应中解密密码,因此必须使用AES 256解密,得到以下异常: 我试图将jce\U policy\u 1-4版本JAR复制到java home security文件夹中,但仍遇到上述异常 Java 1.4中是否有不更改为1.5的解决方案,因为运行jboss server 3.2.3版将不支持Java 1.5。

  • 我正在尝试为我的Flitter应用程序构建一个AAB。我使用以下命令生成密钥库: 我有一把钥匙。属性文件,我已经使用颤振文档中提供的代码引用了它。如何解决这个与Java相关的问题?我的程序引发以下异常

  • 我得到了这段代码的“javax.net.ssl.SSLException:连接重置” 但仅当在使用Open JDK 14中的jlink构建的Java14 JRE下运行时。如果我指向完整的JDK,代码执行得很好。我怀疑JRE中缺少一些东西,但它是什么,为什么jlink没有复制丢失的文件?我基于jdeps的jlink命令如下: jlink中是否缺少模块?关于如何追踪此事,有什么想法或建议吗? 按照建议

  • 问题内容: 背景 我一直在自己的Eclipse项目中使用Authorize.net SDK。一切都很好。然后,我需要将其添加到我的主项目中。我将依赖项添加到类路径中,然后将其复制到所需的代码块中。它应该起作用了。 问题 长话短说,代码在我放置的地方不起作用。但是,当我将其直接应用到项目中的主要方法时,它将起作用。 在无法正常工作的地方,我使用调试器逐步检查了代码,发现以下异常: 抛出: 注意:Ap

  • 我正在使用和 我部署了我的Web应用程序,我得到了以下错误 请帮助我如何解决这个问题。 提前谢谢。这是一个非常重要的问题。 谢谢kalasagar

  • 你将如何解决这个问题? 你从一个盒子开始,盒子里有x个红色大理石,y个绿色大理石和z个蓝色大理石,盒子外还有无限量的红色、绿色和蓝色大理石。一个步骤是选择两种不同的颜色,从盒子中取出两个大理石(两种颜色各一个),然后从你的供应中向盒子中添加第三种颜色的大理石。例如,如果你选择红色和绿色,那么你移除一个红色和一个绿色的大理石,然后放回一个蓝色的。对于什么样的起始条件(表示为x、y、z上的约束),通过