我试图找到在Java SSL客户端中编辑受支持的密码套件的方法,以便提供特定的密码套件列表。
一个建议的解决方案是使用@jww在此链接中发布的 SSLSocketFactoryEx 类:Which Cipher Suites to enable for SSL Socket?
我确实添加了 SSLSocketFactoryEx 类,并运行列出了该类支持的密码的代码(注意:我使用GetCipherList();而不是getSupportedCipheSuites();因为第一个是我在 SSLSocketFactoryEx 中找到的)。代码是:
import java.io.IOException;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Arrays;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class ListCiphers {
public static void main(String[] args) throws UnknownHostException, IOException, KeyManagementException, NoSuchAlgorithmException
{
Security.addProvider(new BouncyCastleProvider());
//BC is the ID for the Bouncy Castle provider;
if (Security.getProvider("BC") == null){
System.out.println("Bouncy Castle provider is NOT available");
}
else{
System.out.println("Bouncy Castle provider is available");
}
SSLSocketFactoryEx factory = new SSLSocketFactoryEx();
String[] cipherSuites = factory.GetCipherList();
System.out.println(Arrays.toString(cipherSuites));
} //end main
}
我的代码得到Bouncy CaSTLe(BC)提供程序的支持,该提供程序说它支持规范中的 ChaCha 密码。另请:https://www.bouncycastle.org/specifications.html
代码的结果(受支持的密码)为:
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_EMPTY_RENEGOTIATION_INFO_SCSV
为什么我看不到带有ChaCha密码的密码?
如果您查看 SSLSocketFactoryEx 代码,则其中包含带有ChaCha的多个密码套件。
使用BC提供程序后,为什么不能在受支持的密码套件列表中找到它们?如何在支持的密码套件列表中添加以下密码套件,以便可以将其包含在客户端问候消息中?
ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
请帮忙。
最佳答案
问题在于JSSE实现(实现Java TLS支持)不支持ChaCha20。现在可以通过JCE提供程序使用ChaCha20实现并不会改变这一点。
不能仅将这类密码类放入其中。密码对要使用的 key ,IV,填充等有特定要求。因此,您需要围绕密码编写代码,以使其受特定的TLS实现支持。
因此,您需要等到受支持为止(如果有的话),或者使用支持该功能的JSSE(Java安全套接字扩展,TLS)提供程序。我猜想它可能会在1.3最终确定后成为可用,因为它已在AEAD(已认证)密码上进行了标准化,ChaCha20 + Poly 1305将是一个非常快速的配置。