0

我正在尝试让 AWS Secrets Manager 在较旧的 Java 7 平台上工作。不幸的是,我们现在锁定在 Java 7 上。

我遇到的问题是 Java 7 在 SSL 方面存在一些安全问题,并且大多数现代 Java 平台都在使用更新的 cipherSuites。因此我得到了错误

javax.net.ssl.SSLHandshakeException:没有可协商的密码套件

在其他接口中,我已经能够通过在 SSL 套接字上执行 .setEnabledCipherSuites 来解决该问题。

这里的问题是 Secrets Manager 客户端没有公开套接字 (AFAICT),也没有公开 SocketFactory。我一直在尝试创建一个新的 SSLContext 包装股票 SSLContext 将提供自定义 SocketFactory 但创建和安装自定义 SSLContext 已被证明是相当复杂的。

在我最终拉出其余的头发之前,有没有更简单的方法可以做到这一点?

AWS Secrets Manager 在后台使用 Apache HTTP 客户端 (httpclient-4.5.7)。是否有一种将 Apache 客户端与自定义 Socket、SocketFactory 或 SSLContext 挂钩的静态方式?一个不需要访问 HTTPClient 对象(也没有公开)的对象。

4

1 回答 1

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();

客户端然后用于请求。

于 2019-07-10T18:13:21.480 回答