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

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

代码

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

抛出以下exception:

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

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

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

非常感谢你们的帮助。

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

  • [是否可以]使用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实现。

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"); 
Interesting Posts