【问题标题】:Java JCE cannot authenticate provider BC in jarsplice created jarJava JCE 无法在 jarsplice 创建的 jar 中验证提供者 BC
【发布时间】:2014-03-04 00:55:47
【问题描述】:

我正在开发一款游戏,并且正在使用 Slick2D 库。我也在使用 bouncycastle 进行加密。然后我使用 jarsplice 将所有内容打包到一个不错的可执行文件中。它运行良好,直到它需要加密某些东西。它给了我一个 java.lang.SecurityException: JCE cannot authenticate the provider BC 我正在使用一个签名的 jarfile (http://www.bouncycastle.org/download/bcprov-jdk15on-150.jar)

这是堆栈跟踪

 java.lang.SecurityException: JCE cannot authenticate the provider BC
    at javax.crypto.Cipher.getInstance(Cipher.java:642)
    at javax.crypto.Cipher.getInstance(Cipher.java:580)
    at net.matrixstudios.zenerith.networking.ZenerithLogin.encryptLogin(ZenerithLogin.java:159)
    at net.matrixstudios.zenerith.networking.ZenerithLogin.<init>(ZenerithLogin.java:112)
    at net.matrixstudios.zenerith.MultiplayerMenu$1.performAction(MultiplayerMenu.java:90)
    at net.matrixstudios.zenerith.gui.menu.MenuGameState.clickButton(MenuGameState.java:83)
    at net.matrixstudios.zenerith.gui.menu.MenuGameState.checkForButtonClicks(MenuGameState.java:75)
    at net.matrixstudios.zenerith.gui.menu.MenuGameState.update(MenuGameState.java:51)
    at net.matrixstudios.zenerith.gui.menu.AbstractGameState.update(AbstractGameState.java:47)
    at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:266)
    at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:663)
    at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
    at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
    at net.matrixstudios.zenerith.gui.Window.<init>(Window.java:28)
    at net.matrixstudios.Main.main(Main.java:28)
Caused by: java.util.jar.JarException: file:/C:/Users/M4trixSh4d0w/Desktop/Zenerith_Alpha.0.2.1.5.jar has unsigned entries - org/bouncycastle/LICENSE.class
    at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:462)
    at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:322)
    at javax.crypto.JarVerifier.verify(JarVerifier.java:250)
    at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:161)
    at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:187)
    at javax.crypto.Cipher.getInstance(Cipher.java:638)
    ... 14 more

那么如何验证 jarfile 以运行? 这是一个独立的可执行 jarfile。

【问题讨论】:

  • 尝试将以下行添加到 java.security 文件 security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider
  • 这会让它在其他人的计算机上运行吗?还是只是我的?我正在尝试制作一个发布 jarfile

标签: java securityexception


【解决方案1】:

我是一名 Android 开发人员,当我将编译和构建工具升级到 Android 12 (31) 时出现此错误,我尝试了很多方法来修复它,最后我发现唯一可行的方法是将 JDK 更改为11.0.14.1(x86_64)的版本,我用的是Mac M1,这个版本的下载地址是:https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html

【讨论】:

    【解决方案2】:

    您可能希望在运行时注册加密服务提供程序,以确保配置适用于所有人。您可以使用 Security.addProvider() 或 Security.insertProviderAt() 方法。请参阅下面“管理提供商”下链接的文档。

    只需使用 addProvider() ,除非提供者的顺序对您来说很重要。我看到一位贡献者评论说您可能会将其插入条目 #9,但我没有看到证据表明这适合您的配置,因此可能只是他/她的配置文件中的一个无关细节。显然,如果我错过了有关您的配置的某些内容并且您确实需要它,那么请使用 insertProviderAt()。

    【讨论】:

    • 我已经有了 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    • 仔细查看您的堆栈跟踪。它说你的罐子里有未签名的条目。认为您还需要对可执行 jar 进行签名。
    • 我签名了,但现在它给了我一个不受信任的签名者错误
    • 会尝试..jarsigner -verify jar-file
    • 在此处查看“确保签名者受信任”。docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多