我有一个Apache Http客户端需要连接到需要TLS 1.2的服务器,但是现在这个客户端在jdk 1.6上运行,此时无法升级。所以我选择了Bouncy Castle。我在我的Mac上进行了设置,如post所示。
这是我使用SSLContextBuilder的代码...
import org.apache.http.ssl.SSLContextBuilder;
SSLContextBuilder sslContextBuilder = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
return true;
}
});
// set SSL context builder to use TLSv1 protocoil
sslContextBuilder = sslContextBuilder.useProtocol("TLSv1.1");
但是在最后一行我得到了这个例外......
Caught: java.security.NoSuchAlgorithmException: TLSv1.1 SSLContext not available
java.security.NoSuchAlgorithmException: TLSv1.1 SSLContext not available
at org.apache.http.ssl.SSLContextBuilder.build(SSLContextBuilder.java:271)
看起来SSLContextBuilder没有看到我的BouncyCastle。或者我的BouncyCastle不支持TLS 1.1吗?如果我将其更改为“TLSv1”,那么它可以正常工作。
或者是否有更好的方法(将我的apache httpclient连接到bouncycastle,以便我的java 6程序可以连接到tlsv1.2服务器)?
答案 0 :(得分:0)
BouncyCastle只是一个JCE提供者(提供加密算法)而不是JSSE提供者(通过SSLSocket,SSLSocketFactory等提供SSL和TLS)。通过添加BouncyCastle作为安全提供程序,您只需注册BouncyCastle的JCE提供程序。更多信息here。
由于Apache HttpClient也使用JSSE,因此您无法插入BouncyCastle的TLS实现。您可以利用BouncyCastle的TLS实现来扩展Java的JSSE类,但这需要一些努力。
如果您想使用BouncyCastle的TLS实施,您可以找到一个示例in this thread。