首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sshj时,"JCE不能验证提供程序BC“。

使用sshj时,"JCE不能验证提供程序BC“。
EN

Stack Overflow用户
提问于 2019-02-14 09:29:49
回答 1查看 3.6K关注 0票数 0

我正在尝试使用sshj库在我公司的现有项目中创建一个SFTP客户端。但是,如果我创建了SSHClient实例,就会得到错误消息:

代码语言:javascript
复制
[main] INFO net.schmizz.sshj.common.SecurityUtils - Registration of Security Provider 'org.bouncycastle.jce.provider.BouncyCastleProvider' unexpectedly failed
java.lang.SecurityException: JCE cannot authenticate the provider BC
    at javax.crypto.JceSecurity.getInstance(JceSecurity.java:118)
    at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:270)
    at net.schmizz.sshj.common.SecurityUtils.registerSecurityProvider(SecurityUtils.java:88)
    at net.schmizz.sshj.common.SecurityUtils.register(SecurityUtils.java:267)
    at net.schmizz.sshj.common.SecurityUtils.isBouncyCastleRegistered(SecurityUtils.java:245)
    at net.schmizz.sshj.DefaultConfig.<init>(DefaultConfig.java:79)
    at net.schmizz.sshj.SSHClient.<init>(SSHClient.java:134)
[... junit stacktrace ...]
Caused by: java.util.jar.JarException: Class is on the bootclasspath
    at javax.crypto.JarVerifier.verify(JarVerifier.java:286)
    at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:164)
    at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:190)
    at javax.crypto.JceSecurity.getInstance(JceSecurity.java:114)
    ... 40 more
[main] INFO net.schmizz.sshj.common.SecurityUtils - BouncyCastle not registered, using the default JCE provider
[main] INFO net.schmizz.sshj.transport.random.JCERandom - Creating new SecureRandom.

应用程序使用maven来包含依赖项,我将其添加如下:

代码语言:javascript
复制
<dependency>
  <groupId>com.hierynomus</groupId>
  <artifactId>sshj</artifactId>
  <version>0.27.0</version>
</dependency>

sshj库包括bcpkix-jdk15on v1.60和bcprov-jdk15on v1.60的赏金城堡(BC)依赖项,我尝试了以下解决方案:

  1. 单独添加BC提供程序,将sshj和BC直接作为库,并像声明的这里一样使用maven中提供的范围。然后正确地添加提供程序,但是仍然会失败,上面的错误消息会导致失败。
  2. 将BC罐子放在jre/lib/ext文件夹中。
  3. 按照声明的java.security文件修改这里文件。
  4. 检查类路径上是否有另一个BC版本,如声明的这里

但是,,如果我创建了一个新的项目并包含了sshj,那么一切都运行得很好,就像预期的那样。我比较了执行junit测试的命令(junit测试是SSHClient的板条箱),在这两个项目中,我都可以找到-classpath中包含的sshj和BC。

我对maven和spring还很陌生,所以我可能遗漏了一些东西,很明显,为什么在一个新的项目中一切都很好,而不是在现有的项目中,但我就是搞不懂。

如果您需要更多的信息,我将乐意提供他们!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-15 11:33:33

在Java中有两个类路径,bootclasspath和普通classpath。引导路径是java.*javax.*所在的位置(jre/lib/rt.jar)。但是,由于系统类装入器没有加载,所以不支持将签名/验证的jars放在其中。您需要确保BouncyCastle jars位于常规类路径(如JRE/JDK中使用-classpath选项指定的那样)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54687084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档