我正在尝试让 AWS Secrets Manager 在较旧的 Java 7 平台上运行。不幸的是,我们现在锁定在 Java 7 上。
我遇到的问题是 Java 7 在 SSL 方面存在一些安全问题,而且大多数现代 Java 平台都在使用更新的密码套件。因此我得到了错误
javax.net.ssl.SSLHandshakeException: No negotiable cipher suite
在其他接口(interface)中,我已经能够通过在 SSL 套接字上执行 .setEnabledCipherSuites 来解决问题。
这里的问题是 Secrets Manager 客户端不公开套接字 (AFAICT),也不公开 SocketFactory。我一直在尝试创建一个新的 SSLContext 来包装将提供自定义 SocketFactory 的库存 SSLContext,但事实证明创建和安装自定义 SSLContext 非常复杂。
在我拔掉剩余的头发之前,有没有更简单的方法?
AWS Secrets Manager 在幕后使用 Apache HTTP 客户端 (httpclient-4.5.7)。是否有一种静态方法可以使用自定义套接字、SocketFactory 或 SSLContext 连接 Apache 客户端?一种不需要访问 HTTPClient 对象(也未公开)的对象。
最佳答案
经过多次思考,我想出了以下代码:
final String ciphers[] =
{ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA256",
"TLS_RSA_WITH_AES_256_CBC_SHA256" };
final String[] protocols = new String[]
{ "TLSv1.2" };
// create and initialize an SSLContext for a custom socket factory
final SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, null, new SecureRandom());
// and here's our SocketFactory
final SSLConnectionSocketFactory secureSocketFactory = new SSLConnectionSocketFactory(sslcontext, protocols,
ciphers, new DefaultHostnameVerifier());
// Create a custom AWS Client Configuration with our socket factory
final ClientConfiguration cc = new ClientConfiguration();
final ApacheHttpClientConfig acc = cc.getApacheHttpClientConfig();
acc.setSslSocketFactory(secureSocketFactory);
// Create a Secrets Manager client with our custom AWS Client Configuration
final AWSSecretsManager client = AWSSecretsManagerClientBuilder //
.standard() //
.withRegion(region) //
.withClientConfiguration(cc) //
.build();
客户端随后用于请求。
关于ssl - Amazon Secrets Manager、Java 7 和 CipherSuites,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56639144/