当前位置: 首页 > 知识库问答 >
问题:

如何在BouncyCastle JSSE提供程序FIPS提供程序中有选择地使用approved only模式?

杜祺
2023-03-14

在Java8上运行的一小部分示例代码中,我试图遵循bc-fips-1.0.2.jar用户指南Legion of the Bouncy Castle Inc. BC-FJA 1.0.2(Bouncy Castle FIPSJavaAPI)用户指南Date: 09/14/19:

注意:对FIPS模式的支持在Java 1.9中似乎已经开始消失,已经确认从Java 11开始它是一个空操作。对于Java 11或更高版本,如果需要FIPS支持,建议使用BCJSSE提供程序。

(第11页的脚注)。我是在“混合”上下文中这样做的,所以大多数线程都在默认模式下运行,有些线程在FIPS批准的仅模式下运行。

但是,这似乎不起作用:似乎一个“批准”的线程正在尝试重用由“未经批准”的线程创建的实例。

具体来说,当以编程方式启用bc-fips-1.0.2时。jar的BCFIPS和bctls-fips-1.0.10。jar的BCJSSE在标准的未修改OpenJDK 8上(在我的例子中是Corretto 8u232),并以编程方式删除内置的SunJSSE提供程序,然后以未批准的模式在新线程上进行HTTPS连接,然后以批准的模式在另一个新线程上进行HTTPS连接,会导致异常:

Caused by: org.bouncycastle.crypto.fips.FipsUnapprovedOperationError: Attempt to use unapproved implementation in approved thread: SHA-512
    at org.bouncycastle.crypto.internal.io.Utils.approvedModeCheck(Unknown Source)
    at org.bouncycastle.crypto.internal.io.DigestOutputStream.write(Unknown Source)
    at org.bouncycastle.crypto.UpdateOutputStream.update(Unknown Source)
    at org.bouncycastle.jcajce.provider.BaseMessageDigest.engineUpdate(Unknown Source)
    at java.html" target="_blank">security.MessageDigest.update(MessageDigest.java:335)
    at org.bouncycastle.tls.crypto.impl.jcajce.JcaTlsCryptoProvider$NonceEntropySource$NonceEntropySourceSpi.runDigest(Unknown Source)
    at org.bouncycastle.tls.crypto.impl.jcajce.JcaTlsCryptoProvider$NonceEntropySource$NonceEntropySourceSpi.engineNextBytes(Unknown Source)
    at java.security.SecureRandom.nextBytes(SecureRandom.java:468)
    at org.bouncycastle.tls.crypto.impl.jcajce.JcaNonceGenerator.<init>(Unknown Source)
    at org.bouncycastle.tls.crypto.impl.jcajce.JcaTlsCrypto.createNonceGenerator(Unknown Source)
    at org.bouncycastle.tls.AbstractTlsContext.createNonceGenerator(Unknown Source)
    at org.bouncycastle.tls.AbstractTlsContext.<init>(Unknown Source)
    at org.bouncycastle.tls.TlsClientContextImpl.<init>(Unknown Source)
[etc]

我尝试的完整再现场景https://gist.github.com/marnix/834610d0fb92e53ce507edfce96bacb9,详情请参阅该类的javadoc。

因此,我的问题是:如何使用BCJSSE而不是SunJSSE使HTTPS连接工作,其中一些连接处于默认模式,而另一些连接处于仅FIPS批准的模式?

或者这在Java 8上不起作用,我是否必须等待Java 9才能开始工作?(为什么?)

(我的最终目标不是HTTPS连接,而是其他连接,其中大多数将在默认模式下运行,一些线程将在仅批准的模式下运行。)

共有1个答案

计均
2023-03-14

使用单独的SSLContext实例是正确的方法,但使用SSLContext。setDefault在这里是非常错误的。部分原因是,一旦删除线程连接,就会出现与setter相关的争用条件。但更重要的是,HttpsURLConnection只设置其默认SSLSocketFactory一次,并将调用SSLContext。getDefault最多只能设置一次,因此调用SSLContext。之后的setDefault将不会对HttpsURLConnection产生影响,您将共享原始SSLContext和FIPS错误。

删除:

SSLContext.setDefault(context);

并替换:

url.openConnection()

与:

HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(context.getSocketFactory());
 类似资料:
  • 我已经在文件中添加了所有相关build.gradle依赖项。尽管如此,当我尝试运行调用SOAP服务时,还是会出现以下错误。共享依赖项部分和错误详细信息。使用Java11。网上已经有很多答案,但似乎都不起作用。任何帮助/建议将是值得赞赏的。 低于错误跟踪

  • 从angular 4.4升级到5.0,并将所有HttpModule和Http更新到HttpClientModule后,我开始出现此错误。 我还再次添加了HttpModule,以确保这不是由于某些依赖关系造成的,但它并不能解决问题 应用程序内。模块,我已正确设置 我不知道这个错误是从哪里来的,或者我不知道如何去了解它。我也有一个警告(也放在下面),可能是相关的。 警告信息:

  • 虽然NatTable已经有一个类RowSelectionProvider,但是我的数据是通过单元格而不是行提供的,所以我不能使用这个类。是否可能创建一个类CellSelectionProvider,或者它会太难? 我要做的是在NatTable中选择一个单元格,它链接到一个eObject。然后在编辑器中选择EObject,并在properties视图中显示其属性。第一部分我能做,但第二部分不行。 我

  • 下面是我的app.js文件 下面是我的状态文件 我有一个模板,我想从那里导航到下一个状态 但是只要我点击这个锚标签,它就会把我导航回主页。(不去我打算去的州)。主要问题是URL(我猜)任何帮助都会很感激。

  • 我正在使用Spring Security的SAML 2.0将我的服务提供商连接到多个身份提供商。 Spring的SAML 2.0文档中的所有内容都是有意义的。我已经阅读了许多有用的教程,包括这篇,它们与我现有的代码类似。 但是,我缺少在哪里以及如何为给定用户选择身份提供者。 我了解SAMLDiscovery可用于将身份提供程序选择委托给第三方服务。我还了解如何配置多个身份提供者。但我正在寻找一种方

  • 我正在使用Spring Security 4.0.1,并希望使用多个身份验证提供程序使用基于Java的配置进行身份验证。如何指定提供程序顺序? 我希望使用AuthenticationManagerBuilder,因为这就是<code>WebSecurityConfigurerAdapter。configureGlobal()公开,但我看不到任何指定顺序的方法。我需要手动创建ProviderMana