使用Bouncy Castle提供程序创建SSLContext实例

时间:2014-05-28 08:43:38

标签: java ssl bouncycastle sslengine

我坚持创建一个SSLContext(我想用它来实例化一个SSLEngine来处理通过java-nio的加密传输):

代码

String protocol = "TLSv1.2";
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
sslContext = SSLContext.getInstance(protocol,provider.getName());

抛出以下异常:

Exception in thread "main" java.lang.RuntimeException: java.security.NoSuchAlgorithmException: no such algorithm: SSL for provider BC
at org.bitmash.network.tcp.ssl.SslTransferFactory.<init>(SslTransferFactory.java:43)
at org.bitmash.network.http.HttpsServer.<init>(HttpsServer.java:19)

我将Bouncy Castle的当前提供程序包'bcprov-jdk15on-150.jar'(我从here获得)附加到应用程序类路径以及它的bootclasspath(通过VM-Option -Xbootclasspath / p) ,但都没有解决问题。我也尝试了protocol(即'SSL'和'TLSv1')的不同值,但没有任何影响。

此外,我发现有类似问题的人herehere。但与他们相比,我的目标(我正在使用)Java 7(或更高版本),但我仍然有这个问题。是这样 - 一般 - 甚至可以这样使用Bouncy Castle,或者我是否必须使用各自的API而不是oracle的NIO via SSLEngine重写我的协议(这是我现在正在做的方式)?< / p>

非常感谢你们的帮助。

3 个答案:

答案 0 :(得分:12)

我知道这是一个老问题,但我需要一个答案(所以我创建一个):

  • [是否可以]使用Bouncy Castle提供程序创建SSLContext实例[?]
  • 没有

为什么不呢?

调试这行代码:

Provider [] providers = Security.getProviders();
  • 默认的SunJSSE 1.7版实现了以下SSLContext值:
      

    Alg.Alias.SSLContext.SSL =使用TLSv1
      Alg.Alias.SSLContext.SSLv3 =的TLSv1
      SSLContext.Default = sun.security.ssl.SSLContextImpl $ DefaultSSLContext
      SSLContext.TLSv1 = sun.security.ssl.SSLContextImpl $ TLS10Context
      SSLContext.TLSv1.1 = sun.security.ssl.SSLContextImpl $ TLS11Context
      SSLContext.TLSv1.2 = sun.security.ssl.SSLContextImpl $ TLS12Context

  • 使用bcprov-jdk15on-152.jar并向安全性添加新的BouncyCastleProvider(),可以观察到没有可用的SSLContext值。

这应该是有道理的,因为Bouncy Castle是JCE实现,而不是JSSE实现。

答案 1 :(得分:4)

Bouncy Castle实际上提供了1.56版本的JSSE实现。 只需确保在 java.security 中配置更高优先级:

security.provider.1=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
...
security.provider.6=com.sun.net.ssl.internal.ssl.Provider

您可以使用标准API:

SSLContext context = SSLContext.getInstance("TLS");

答案 2 :(得分:1)

Bouncy Castle为JSSE实现了两种类型的提供程序:

  • 一个普通 DTLS / TLS和JSSE提供程序包
  • FIPS-compliant(D)TLS API和JSSE提供程序

每个提供商的最新文档可在以下位置找到:ordinaryFIPS-compliant

这些的JAR文件不同于Bouncy Castle JCE提供程序的JAR文件。在撰写本文时,JSSE提供程序JAR文件称为bctls-jdk15on-1.64.jarbctls-fips-1.0.9.jar,而JCE提供程序称为bcprov-jdk15on-1.64.jar

以下是文档摘录:

2.1 BCJSSE Provider安装到JRE中

一旦安装了bctls jar,如果全局应用程序中需要提供程序类BouncyCastleJsseProvider,则可能需要安装它。

可以通过在JVM中静态地安装提供程序,方法是将其添加到JRE / JDK的java.security目录中的jre/lib/security文件的提供程序定义中。

还可以在执行期间添加提供程序。如果希望在执行期间将提供程序全局添加到JVM,则可以将以下导入添加到代码中:

import java.security.Security
import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider

然后插入行

Security.addProvider(new BouncyCastleJsseProvider());

然后可以通过引用名称BCJSSE使用提供程序,例如:

SSLContext clientContext = SSLContext.getInstance("TLS", "BCJSSE");

或者,如果您不想在全球范围内安装提供程序,而是在本地使用它,则可以将提供程序传递给您要创建其实例的JSSE类上的getInstance()方法。

例如:

SSLContext clientContext = SSLContext.getInstance("TLS",
       new BouncyCastleJsseProvider());