【问题标题】:"JCE cannot authenticate the provider BC" when using sshj使用 sshj 时“JCE 无法验证提供者 BC”
【发布时间】:2019-02-14 09:29:49
【问题描述】:

我正在尝试使用 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 直接作为库包含并使用 maven 中提供的范围,如 here 所述。然后正确添加了提供程序,但仍然失败并显示上面的错误消息。
  2. 将 BC JAR 放在 jre/lib/ext 文件夹中。
  3. here所述修改java.security文件。
  4. 检查类路径上是否有另一个 BC 版本,如 here 所述。

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

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

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

【问题讨论】:

  • 请检查此链接stackoverflow.com/questions/13721579/… 并尝试按照 cmets 的说明编辑您的 java.security
  • 感谢@sam3131 的提示,但我的第 3 点是,我已经尝试编辑 java.security 文件。此外,我没有提取或重新编译 BC JAR,只是尝试使用它们。所以签名不应该以任何方式被触摸 afaik。

标签: java spring maven bouncycastle sshj


【解决方案1】:

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

【讨论】:

  • 感谢您的提示,它实际上将我引向了正确的方向。我正在使用 PowerMock 测试我的类,@RunWith(PowerMockRunner.class) 导致在引导类路径上加载类时出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多