我正在尝试使用 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) 依赖项,我尝试了以下解决方案:
- 自行添加 BC 提供程序,直接将 sshj 和 BC JAR 包含为库,并按照所述 here 使用 maven 中提供的范围。 。然后正确添加提供程序,但仍然失败,并显示上面的错误消息。
- 将 BC JAR 放入
jre/lib/ext
文件夹中。 - 按照所述修改 java.security 文件 here .
- 检查类路径上是否有另一个 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/