我正在尝试让AWS Secrets Manager在较旧的Java 7平台上工作。不幸的是,我们目前仅锁定Java 7。
我遇到的问题是Java 7在SSL方面存在一些安全问题,并且大多数现代Java平台都在使用较新的cipherSuite。因此我得到了错误
javax.net.ssl.SSLHandshakeException:没有可协商的密码套件
在其他接口中,我已经可以通过在SSL套接字上执行.setEnabledCipherSuites来解决此问题。
这里的问题是Secrets Manager客户端不公开套接字(AFAICT),也不公开SocketFactory。我一直在尝试创建一个新的SSLContext,包装将提供自定义SocketFactory的库存SSLContext,但是事实证明,创建和安装自定义SSLContext非常复杂。
在我最终拔出其余的头发之前,有没有更简单的方法可以做到这一点?
AWS Secrets Manager在幕后使用Apache HTTP Client(httpclient-4.5.7)。是否有静态方法将Apache客户端与自定义Socket,SocketFactory或SSLContext挂钩?不需要访问HTTPClient对象的对象(该对象也不公开)。
答案 0 :(得分:0)
经过很多次敲打之后,我想到了以下代码:
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();
然后,客户端用于请求。