Ssl 在JDK1.7上是否可以将GCM与BC一起使用?
我正在尝试使用任何AES GCM变体进行TLS连接,根据我在文档中的理解,这应该是可能的,但我得到以下错误:Ssl 在JDK1.7上是否可以将GCM与BC一起使用?,ssl,encryption,java-7,bouncycastle,aes-gcm,Ssl,Encryption,Java 7,Bouncycastle,Aes Gcm,我正在尝试使用任何AES GCM变体进行TLS连接,根据我在文档中的理解,这应该是可能的,但我得到以下错误: Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.Alerts.getSSLExcept
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1989)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1096)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1342)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1369)
问题是我尝试连接的服务器只接受以下密码:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
我无法在此发布我尝试连接的服务器,但我尝试在github repo上复制该问题。我没有找到一个只接受这些密码套件的服务器,这就是我的repo失败的原因
git clone https://github.com/andreicristianpetcu/gcm_with_bc_onjdk17
cd gcm_with_bc_onjdk17
JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/jre" mvn clean install
基本上这是来自GitHub的代码
package com.github.gcm_with_bc_onjdk17;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
public class GcmWithBouncyCasteleOnJDK17 {
public SSLConnectionSocketFactory getSslConnectionSocketFactory() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, KeyManagementException, IOException {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
System.out.println(cipher);
SSLContext sslContext = SSLContexts.custom()
.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.build();
HttpGet out = new HttpGet("https://cloudflare.com/");
CloseableHttpResponse execute = httpClient.execute(out);
return sslConnectionSocketFactory;
}
}
谢谢一位同事解决了这个问题: JDK7似乎支持TLS1.2,但不支持AES GCM密码。由于加密提供程序是一个列表,所以JDK提供程序被选中,因为它支持TLS 1.2,即使它不支持所需的密码。只需将Bouncy Castle在列表中放高一点,就解决了这个问题 我不知道为什么我的问题被否决了:我不知道我违反了什么规则,所以它被否决了,我甚至提供了源代码
无论如何。。。。非常高兴我找到了修复方法,即使它在堆栈溢出之外。把它留给子孙后代。一位同事发现了这个问题: JDK7似乎支持TLS1.2,但不支持AES GCM密码。由于加密提供程序是一个列表,所以JDK提供程序被选中,因为它支持TLS 1.2,即使它不支持所需的密码。只需将Bouncy Castle在列表中放高一点,就解决了这个问题 我不知道为什么我的问题被否决了:我不知道我违反了什么规则,所以它被否决了,我甚至提供了源代码
无论如何。。。。非常高兴我找到了修复方法,即使它在堆栈溢出之外。将其留给子孙后代。错误信息是什么?感谢您Eugene对此进行调查。出于后代的原因,我添加了错误消息作为问题的一部分。幸运的是,一位同事想出了解决办法。你能解释一下为什么我被选为a-1吗?我是否违反了任何堆栈溢出规则?再次感谢您调查我的问题。我不知道,也没有人知道是谁和为什么。当有评论时,我们可以认为评论的人就是投票人。所以,这并不是完美的,你无法想象有多少人提问,得到他们的答案,甚至不把它标记为正确。我会为你的出色表现向上投票。错误信息是什么?谢谢你Eugene调查此事。出于后代的原因,我添加了错误消息作为问题的一部分。幸运的是,一位同事想出了解决办法。你能解释一下为什么我被选为a-1吗?我是否违反了任何堆栈溢出规则?再次感谢您调查我的问题。我不知道,也没有人知道是谁和为什么。当有评论时,我们可以认为评论的人就是投票人。所以,这并不是完美的,你无法想象有多少人提问,得到他们的答案,甚至不把它标记为正确。我会为你的出色表现向上投票。你可以将你的答案标记为正确,参见小的更正,你应该在你的insertProviderAt调用中使用1和2作为索引。根据,该列表以1为基础。如果您使用0,它会将其添加到末尾。您可以将答案标记为正确,请参阅小更正,您应该在insertProviderAt调用中使用1和2作为索引。根据,该列表以1为基础。如果使用0,它会将其添加到末尾。
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.removeProvider(BouncyCastleJsseProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(), 0);
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);