java - 使用 sshj 时为 "JCE cannot authenticate the provider BC"

标签 java spring maven bouncycastle sshj

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

[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 来包含依赖项,我这样添加它:

<dependency>
  <groupId>com.hierynomus</groupId>
  <artifactId>sshj</artifactId>
  <version>0.27.0</version>
</dependency>

sshj 库包含对 bcpkix-jdk15on v1.60 和 bcprov-jdk15on v1.60 的 bouncycaSTLe (BC) 依赖项,我尝试了以下解决方案:

  1. 自行添加 BC 提供程序,直接将 sshj 和 BC JAR 包含为库,并按照所述 here 使用 maven 中提供的范围。 。然后正确添加提供程序,但仍然失败,并显示上面的错误消息。
  2. 将 BC JAR 放入 jre/lib/ext 文件夹中。
  3. 按照所述修改 java.security 文件 here .
  4. 检查类路径上是否有另一个 BC 版本,如所述 here .

但是如果我创建一个新项目并包含 sshj ,一切都会正常工作并按预期进行。我比较了执行 junit 测试的命令,该测试创建了 SSHClient,在这两个项目中我都可以找到 sshj JAR 和 BC JAR 包含在 -classpath 中。

我对 Maven 和 Spring 相当陌生,所以我可能会错过一些明显的东西,为什么在一个新项目中一切都很好,而不是在现有项目中,但我就是无法弄清楚。

如果您需要更多信息,我很乐意提供!

最佳答案

Java 中有 2 个类路径,bootclasspath 和常规 classpath。 bootclasspath 是 java.*javax.* 所在的位置 (jre/lib/rt.jar)。但因为它不是由系统类加载器加载的,所以不支持将签名/验证的 jar 放入其中。您需要确保 BouncyCaSTLe jar 位于常规类路径上(使用 JRE/JDK 中的 -classpath 选项指定

关于java - 使用 sshj 时为 "JCE cannot authenticate the provider BC",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54687084/

相关文章:

java - 我有正确的 XPath,但 selenium 没有在 Highcharts 弹出窗口中单击

java - @Async 与 Spring 3.0.6

java - 在完全离线的环境下开发Spring Boot项目,可能吗?

android - Maven 中的传递 AAR 依赖项

java - 机器人框架 - 来自谷歌文档的示例不起作用

java - LibGDX 的 mesh.getVerticies 输出什么?

java - 使用try/catch方法获取一个参数,该参数将从java中的方法中产生特定的输出

java - 是否有可能在不终止现有 Web 服务的情况下向部署在 Tomcat 上的 Web 服务添加模块

java - 组织.hibernate.TransactionException : JDBC begin failed i

java - 执行时缺少所需的类