Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Bouncy Castle提供程序创建SSLContext实例_Java_Ssl_Bouncycastle_Sslengine - Fatal编程技术网

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

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

我一直在创建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)
线程“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。