使用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");