我坚持创建一个SSLContext(我想用它来实例化一个SSLEngine来处理通过java-nio的加密传输):
代码
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)
我将Bouncy Castle的当前提供程序包'bcprov-jdk15on-150.jar'(我从here获得)附加到应用程序类路径以及它的bootclasspath(通过VM-Option -Xbootclasspath / p) ,但都没有解决问题。我也尝试了protocol
(即'SSL'和'TLSv1')的不同值,但没有任何影响。
此外,我发现有类似问题的人here和here。但与他们相比,我的目标(我正在使用)Java 7(或更高版本),但我仍然有这个问题。是这样 - 一般 - 甚至可以这样使用Bouncy Castle,或者我是否必须使用各自的API而不是oracle的NIO via SSLEngine重写我的协议(这是我现在正在做的方式)?< / p>
非常感谢你们的帮助。
答案 0 :(得分:12)
我知道这是一个老问题,但我需要一个答案(所以我创建一个):
为什么不呢?
调试这行代码:
Provider [] providers = Security.getProviders();
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
答案 1 :(得分:4)
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");
答案 2 :(得分:1)
Bouncy Castle为JSSE实现了两种类型的提供程序:
每个提供商的最新文档可在以下位置找到:ordinary和FIPS-compliant。
这些的JAR文件不同于Bouncy Castle JCE提供程序的JAR文件。在撰写本文时,JSSE提供程序JAR文件称为bctls-jdk15on-1.64.jar
和bctls-fips-1.0.9.jar
,而JCE提供程序称为bcprov-jdk15on-1.64.jar
。
以下是文档摘录:
2.1 BCJSSE Provider安装到JRE中
一旦安装了bctls jar,如果全局应用程序中需要提供程序类BouncyCastleJsseProvider,则可能需要安装它。
可以通过在JVM中静态地安装提供程序,方法是将其添加到JRE / JDK的
java.security
目录中的jre/lib/security
文件的提供程序定义中。还可以在执行期间添加提供程序。如果希望在执行期间将提供程序全局添加到JVM,则可以将以下导入添加到代码中:
import java.security.Security import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
然后插入行
Security.addProvider(new BouncyCastleJsseProvider());
然后可以通过引用名称
BCJSSE
使用提供程序,例如:SSLContext clientContext = SSLContext.getInstance("TLS", "BCJSSE");
或者,如果您不想在全球范围内安装提供程序,而是在本地使用它,则可以将提供程序传递给您要创建其实例的JSSE类上的
getInstance()
方法。例如:
SSLContext clientContext = SSLContext.getInstance("TLS", new BouncyCastleJsseProvider());