"JCE cannot authenticate the provider BC" 使用 sshj 时
"JCE cannot authenticate the provider BC" when using 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) 依赖项,我尝试了以下解决方案:
- 我自己添加 BC 提供程序,将 sshj 和 BC JAR 直接作为库包含在内,并按照 here 所述在 maven 中使用提供的范围。然后正确添加提供程序,但仍然失败并显示上面的错误消息。
- 将 BC JAR 放在
jre/lib/ext
文件夹中。
- 按照 here 所述修改 java.security 文件。
- 检查类路径上是否有另一个 BC 版本,如所述 here。
但是 如果我创建一个新项目并包含 sshj,一切都按预期正常工作。我比较了执行创建 SSHClient 的 junit 测试的命令,在这两个项目中我都可以找到 -classpath
.
中包含的 sshj JAR 和 BC JAR
我对 maven 和 spring 还很陌生,所以我可能遗漏了一些明显的东西,为什么在一个新项目中一切都很好,而不是在现有项目中,但我就是想不通。
如果您需要更多信息,我很乐意提供!
Java 中有 2 个类路径,bootclasspath
和常规 classpath
。引导类路径是 java.*
和 javax.*
所在的位置 (jre/lib/rt.jar)。但是因为它不是由系统类加载器加载的,所以不支持在其中放置 signed/verified 罐子。您需要确保 BouncyCastle 罐子位于常规类路径中(如使用 JRE/JDK
中的 -classpath
选项指定的那样)
我正在尝试使用 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
文件夹中。 - 按照 here 所述修改 java.security 文件。
- 检查类路径上是否有另一个 BC 版本,如所述 here。
但是 如果我创建一个新项目并包含 sshj,一切都按预期正常工作。我比较了执行创建 SSHClient 的 junit 测试的命令,在这两个项目中我都可以找到 -classpath
.
我对 maven 和 spring 还很陌生,所以我可能遗漏了一些明显的东西,为什么在一个新项目中一切都很好,而不是在现有项目中,但我就是想不通。
如果您需要更多信息,我很乐意提供!
Java 中有 2 个类路径,bootclasspath
和常规 classpath
。引导类路径是 java.*
和 javax.*
所在的位置 (jre/lib/rt.jar)。但是因为它不是由系统类加载器加载的,所以不支持在其中放置 signed/verified 罐子。您需要确保 BouncyCastle 罐子位于常规类路径中(如使用 JRE/JDK
-classpath
选项指定的那样)