我被困在创建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获得)附加到应用程序类路径及其引导类路径(通过VM-Option -Xbootclasspath/p),但都没有解决问题。我还尝试了不同的protocol值(即:‘'SSL’和'TLSv1')没有任何影响。
另外,我发现here和here也有类似的问题。但与它们形成对比的是,我的目标是(并且正在使用) Java 7(或更高版本),但我仍然有这个问题。它是通用的吗--甚至可以这样使用Bouncy Castle,或者我必须使用他们各自的-in而不是oracle的NIO via SSLEngine来重写我的协议(这就是我现在正在做的)?
非常感谢你在这里的帮助。
发布于 2017-06-27 21:20:08
Bouncy Castle实际上提供了从1.56版开始的JSSE实现。只需确保在应用程序启动时将其配置为更高的优先级:
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);或者,作为替代方法,在全局<JRE_HOME>/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");发布于 2020-04-06 02:35:31
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。
以下是文档的摘录:
JRE2.1BCJSSE提供程序安装到
中
安装bctls jar之后,如果应用程序全局需要提供程序类BouncyCastleJsseProvider,则可能需要安装它。
提供程序的安装可以在JVM中静态完成,方法是将其添加到JRE/JDK的jre/lib/security目录中的java.security文件的提供程序定义中。
还可以在执行过程中添加提供程序。如果您希望在执行期间将提供程序全局添加到JVM中,则可以将以下导入添加到代码中:
导入org.bouncycastle.jsse.provider.BouncyCastleJsseProvider导入java.security.Security
然后插入下面这行
新建(Security.addProvider BouncyCastleJsseProvider());
然后,可以通过引用名称BCJSSE来使用提供程序,例如:
SSLContext clientContext = SSLContext.getInstance("TLS","BCJSSE");
或者,如果您不希望全局安装提供程序,而是在本地使用它,则可以将提供程序传递给要创建实例的JSSE类上的getInstance()方法。
例如:
SSLContext clientContext = SSLContext.getInstance("TLS",SSLContext BouncyCastleJsseProvider());
https://stackoverflow.com/questions/23906736
复制相似问题