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

Seb*_*itt 11 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());
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢你们的帮助.

k2z*_*ger 13

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

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

为什么不?

调试这行代码:

Provider [] providers = Security.getProviders();
Run Code Online (Sandbox Code Playgroud)
  • 默认的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并向Security添加一个新的BouncyCastleProvider(),可以观察到没有可用的SSLContext值.

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


小智 5

从1.56版本开始,Bouncy Castle实际上提供了JSSE实现。只要确保在java.security中将其配置为更高的优先级即可:

security.provider.1=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
...
security.provider.6=com.sun.net.ssl.internal.ssl.Provider
Run Code Online (Sandbox Code Playgroud)

然后可以将其与标准API一起使用:

security.provider.1=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
...
security.provider.6=com.sun.net.ssl.internal.ssl.Provider
Run Code Online (Sandbox Code Playgroud)

  • 并注意它是一个单独的jar-bctls- $ version不(只是)bcprov- $ version。 (3认同)