首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Bouncy Castle提供程序创建SSLContext实例

使用Bouncy Castle提供程序创建SSLContext实例
EN

Stack Overflow用户
提问于 2014-05-28 16:43:38
回答 2查看 12.1K关注 0票数 12

我被困在创建SSLContext (我想用它来实例化一个SSLEngine来处理通过java-nio进行的加密传输):

代码

代码语言:javascript
复制
String protocol = "TLSv1.2";
Provider provider = new BouncyCastleProvider();
Security.addProvider(provider);
sslContext = SSLContext.getInstance(protocol,provider.getName());

引发以下异常:

代码语言:javascript
复制
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')没有任何影响。

另外,我发现herehere也有类似的问题。但与它们形成对比的是,我的目标是(并且正在使用) Java 7(或更高版本),但我仍然有这个问题。它是通用的吗--甚至可以这样使用Bouncy Castle,或者我必须使用他们各自的-in而不是oracle的NIO via SSLEngine来重写我的协议(这就是我现在正在做的)?

非常感谢你在这里的帮助。

EN

回答 2

Stack Overflow用户

发布于 2017-06-27 21:20:08

Bouncy Castle实际上提供了从1.56版开始的JSSE实现。只需确保在应用程序启动时将其配置为更高的优先级:

代码语言:javascript
复制
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);

或者,作为替代方法,在全局<JRE_HOME>/lib/security/java.security文件中:

代码语言:javascript
复制
security.provider.1=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
...
security.provider.6=com.sun.net.ssl.internal.ssl.Provider

然后您可以将其与标准API一起使用:

代码语言:javascript
复制
SSLContext context = SSLContext.getInstance("TLS");
票数 8
EN

Stack Overflow用户

发布于 2020-04-06 02:35:31

Bouncy Castle为JSSE实现了两种类型的提供者:

  • 普通的DTLS/TLS和JSSE提供程序包
  • A FIPS-compliant (D)TLS API和JSSE提供程序

可以在此处找到每个提供程序的当前文档:ordinaryFIPS-compliant

这些JAR文件与Bouncy Castle JCE提供程序的JAR文件不同。在撰写本文时,JSSE提供者JAR文件称为bctls-jdk15on-1.64.jarbctls-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());

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23906736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档