Amazon Secrets Manager,Java 7和CipherSuites

时间:2019-06-17 21:29:47

标签: ssl apache-httpclient-4.x tls1.2 jsse aws-secrets-manager

我正在尝试让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对象的对象(该对象也不公开)。

1 个答案:

答案 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();
然后,

客户端用于请求。