Java 使用Bouncy Castle提供程序创建SSLContext实例
我一直在创建SSLContext(我想用它实例化一个SSLEngine,以通过java nio处理加密传输): 代码Java 使用Bouncy Castle提供程序创建SSLContext实例,java,ssl,bouncycastle,sslengine,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()); 引发以下异常: Excepti
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)
线程“main”java.lang.RuntimeException中的异常:java.security.NoSuchAlgorithmException:无此类算法:提供程序BC的SSL
位于org.bitmash.network.tcp.ssl.sslttransferfactory.(sslttransferfactory.java:43)
位于org.bitmash.network.http.HttpsServer(HttpsServer.java:19)
我将Bouncy Castle当前的提供程序包“bcprov-jdk15on-150.jar”(我从中获得)连接到应用程序类路径及其引导类路径(通过VM选项-Xbootclasspath/p),但都没有解决问题。我还尝试了协议的不同值(即“SSL”和“TLSv1”),但没有任何效果
此外,我还发现有类似问题的人。但与之相反,我的目标是(并且我正在使用)Java7(或更高版本),但我仍然存在这个问题。一般来说,这样使用Bouncy Castle是否可行,或者我是否必须使用各自的API而不是oracle(我现在就是这样做的)重写协议
非常感谢您的帮助。我知道这是一个老问题,但我需要一个答案(因此我正在创建一个):
- [是否可以]使用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是一个实现,而不是一个实现。Bouncy Castle实际上从1.56版开始提供了JSSE实现。
只需确保在应用程序启动时将其配置为更高的优先级:
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);
或者,在全局/lib/security/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”);
Bouncy Castle为JSSE实现了两种类型的提供程序:
- 普通DTLS/TLS和JSSE提供程序包
- (D)TLS API和JSSE提供程序
每个提供商的当前文档可在此处找到:和
这些的JAR文件不同于Bouncy Castle JCE provider的JAR文件。在编写本文时,JSSE提供者JAR文件被称为bctls-jdk15on-1.64.JAR
和bctls-fips-1.0.9.JAR
,而JCE提供者是bcprov-jdk15on-1.64.JAR
以下是文档的摘录:
2.1将BCJSSE提供程序安装到JRE中
安装bctls jar后,如果应用程序全局需要,可能需要安装提供程序类BouncyCastleJsseProvider
通过将提供程序添加到jre/JDK的jre/lib/security
目录中的java.security
文件中,可以在JVM中静态安装提供程序
还可以在执行期间添加提供程序。如果希望在执行期间全局地将提供程序添加到JVM,可以将以下导入添加到代码中:
import java.security.Security
import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
然后插入行
Security.addProvider(new BouncyCastleJsseProvider());
然后可以通过引用名称BCJSSE
来使用提供程序,例如:
SSLContext clientContext = SSLContext.getInstance("TLS", "BCJSSE");
SSLContext clientContext = SSLContext.getInstance("TLS",
new BouncyCastleJsseProvider());
或者,如果您不希望全局安装提供程序,而是在本地使用它,则可以将提供程序传递给正在创建其实例的JSSE类上的getInstance()
方法
例如:
SSLContext clientContext = SSLContext.getInstance("TLS", "BCJSSE");
SSLContext clientContext = SSLContext.getInstance("TLS",
new BouncyCastleJsseProvider());
另一方面,如果您试图使用KeyGenerator创建一个密钥,那么BC非常适合这样做!KeyGenerator.getInstance(“Threefish-256”,“BC”)或KeyGenerator.getInstance(“HMACSHA512/224”,“BC”)-你明白了…注意它是一个单独的jar——bctls-$version,而不仅仅是bcprov-$version。