无法创建org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings的实例:java.lang.SecurityException

无法创建org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings的实例:java.lang.SecurityException,java,lotus-notes,bouncycastle,lotus-domino,securityexception,Java,Lotus Notes,Bouncycastle,Lotus Domino,Securityexception,我正在编写一个程序,它有一个静态块,如下所示: static { Security.addProvider(new BouncyCastleProvider()); } 这里我有一个例外: Exception in thread "Launcher: JavaAgent" java.lang.InternalError: cannot create instance of org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings : j

我正在编写一个程序,它有一个静态块,如下所示:

static
{
Security.addProvider(new BouncyCastleProvider());
}
这里我有一个例外:

Exception in thread "Launcher: JavaAgent" java.lang.InternalError: cannot create instance of org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings : java.lang.SecurityException
    at org.bouncycastle.jce.provider.BouncyCastleProvider.loadAlgorithms(Unknown Source)
    at org.bouncycastle.jce.provider.BouncyCastleProvider.setup(Unknown Source)
    at org.bouncycastle.jce.provider.BouncyCastleProvider.access$000(Unknown Source)
    at org.bouncycastle.jce.provider.BouncyCastleProvider$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(AccessController.java:594)
    at org.bouncycastle.jce.provider.BouncyCastleProvider.<init>(Unknown Source)
    at JavaAgent.<clinit>(JavaAgent.java:46)
    at java.lang.J9VMInternals.newInstanceImpl(Native Method)
    at java.lang.Class.newInstance(Class.java:1899)
    at lotus.domino.AgentInfo.newInstance(Unknown Source)
    at lotus.domino.AgentLauncher.run(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)
线程“Launcher:JavaAgent”java.lang.InternalError:无法创建org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings的实例:java.lang.SecurityException
位于org.bouncycastle.jce.provider.BouncyCastleProvider.loadAlgorithms(未知源)
位于org.bouncycastle.jce.provider.BouncyCastleProvider.setup(未知源)
在org.bouncycastle.jce.provider.BouncyCastleProvider.access$000(未知来源)
位于org.bouncycastle.jce.provider.BouncyCastleProvider$1.run(未知来源)
位于java.security.AccessController.doPrivileged(AccessController.java:594)
位于org.bouncycastle.jce.provider.BouncyCastleProvider。(未知来源)
在JavaAgent。(JavaAgent.java:46)
位于java.lang.J9VMInternals.newInstanceImpl(本机方法)
位于java.lang.Class.newInstance(Class.java:1899)
位于lotus.domino.AgentInfo.newInstance(未知源)
位于lotus.domino.AgentLauncher.run(未知源)
位于lotus.domino.NotesThread.run(未知源)
我已经尝试了很多,包括在java.security文件中添加:“security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider”

我还尝试了将权限java.security.SecurityPermission“putProviderProperty.BC”添加到java.policy文件


但似乎没有什么能解决这个问题!我已经将它添加到我电脑上所有JVM的所有文件中。问题是我使用的是IBM Domino/Notes软件。有可能在那里工作吗?我就是无法发现问题。

所以我也犯了这个错误,我能够找到一种解决方法,尽管不是一种可伸缩的方法。但是,如果您担心它只在您的机器上工作,那么此解决方案将适用于您

为了让阅读此答案的其他人清楚,我们之所以在这里,是因为IBM Notes(IBM Lotus Notes)实际上运行在Java之上,特别是Java 1.6(实际上运行在IBM J9虚拟机上)。尽管Notes的大部分定制代码都可以用(类似VisualBasic的变体)编写,但Notes允许您用Java本身进行开发。这提供了极好的灵活性,但是如果您的代码需要通过HTTPS和您正在与之通信的服务器进行任何通信(这是自2018年的回答起的现代标准),。那有什么好办法?第三方库,如Bouncy Castle。这就把我们带到了这里

错误 错误/堆栈跟踪与我得到的错误完全相同。它没有提供很多有意义的信息。因此,我所做的就是对BouncyCastleProvider源代码进行了一些修改(特别是BouncyCastleProvider.java)。在它使用反射实例化每个摘要/密码等的地方,我只是手动实例化了每个类。您将看到它在
loadAlgorithms
方法中失败。
loadAlgorithms
方法实例化一个类列表,然后调用类上的
.configure()
方法,传入
这个
(BouncyCastleProvider
类的一个实例。当我手动执行此操作时,我再现了相同的错误,但有更多的细节:

java.lang.ExceptionInInitializerError
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:222)
        at JavaAgent.NotesMain(Unknown Source)
        at lotus.domino.AgentBase.runNotes(Unknown Source)
        at lotus.domino.NotesThread.run(Unknown Source)
Caused by: java.lang.SecurityException
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:582)
        at COM.ibm.JEmpower.applet.AppletSecurity.checkSecurityPermission(AppletSecurity.java:1332)
        at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1613)
        at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
        at java.lang.SecurityManager.checkSecurityAccess(SecurityManager.java:1725)
        at java.security.Provider.put(Provider.java:243)
        at ExplicitBouncyCastleProvider.addAlgorithm(Unknown Source)
        at org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings.configure(Unknown Source)
        at ExplicitBouncyCastleProvider.setup(Unknown Source)
        at ExplicitBouncyCastleProvider.access$0(Unknown Source)
        at ExplicitBouncyCastleProvider$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(AccessController.java:202)
        at ExplicitBouncyCastleProvider.<init>(Unknown Source)
        at TLSSocketConnectionFactory.<clinit>(Unknown Source)
        at java.lang.J9VMInternals.initializeImpl(Native Method)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
        ... 6 more
现在,当您在Java代码中调用
HttpsURLConnection con=(HttpsURLConnection)urlObj.openConnection();
时,它会自动为TLS1.2找到这个弹性城堡提供程序,意识到它信任它,并使用TLS1.2通过HTTPS打开连接。这为我解决了同样的问题

免责声明1:同样,必须为客户执行此操作,即所有需要执行此操作的客户都必须执行此过程

免责声明2:我在安装IBM Domino Designer的同一台机器上完成了此操作(我相信我所经历的步骤之一是将ext目录中的这个JAR添加到Domino Designer中数据库Java项目的构建路径中,但我认为这实际上不是必需的)


尽管如此,对于所有必须使用此代码的Notes客户机来说,唯一可行的方法是修改IBM Notes安装程序,并将其与客户机安装捆绑在一起,以便将来进行所有安装

相反,为了避免这一切,在您公司的安全VPN中,通过内部代理使用普通HTTP或TLS 1.0(Java 1.6支持)。换句话说,在您公司的内部网上设置一个web中继,侦听普通HTTP请求(如果您真的想使用HTTPS,也可以使用TLS 1.0保护它)并使用TLS 1.2将它们转发到目标。这被称为代理。这将完全位于Notes之外,可以使用Apache HTTPD或您喜欢的任何编程语言(如Java或C#)来完成。

;我希望IBM也一样。否则,如果可以的话,请使用+2:)
# bcprov-jdk15on-159.jar
SHA1-Digest-Manifest: JQcgQkGrRQRWvbjowKj5huQYvZk=