使用sshj时,“ JCE无法验证提供者BC”

时间:2019-02-14 09:29:49

标签: 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的充气城堡(BC)依赖性,我已经尝试了以下解决方案:

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

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

我对Maven和Spring还是比较陌生,所以我可能会明显错过一些东西,为什么在一个新项目中一切都很好,而在现有项目中却没有,但是我只是想不通。

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

1 个答案:

答案 0 :(得分:1)

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