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
我知道这是一个老问题,但我需要一个答案(所以我创建了一个):
为什么不?
调试这行代码:
Provider [] providers = Security.getProviders();
Run Code Online (Sandbox Code Playgroud)
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
这应该是有道理的,因为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)