ssl - Amazon Secrets Manager、Java 7 和 CipherSuites

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

我正在尝试让 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/

相关文章:

email - 单独的电子邮件服务器和 Web 托管服务器上的 SSL 证书?

python - asyncpg 错误 : "no pg_hba.conf entry for host" in Heroku

java - 处理 GET 请求 - Apache HttpClient 与 java.net.HttpURLConnection

ssl - Websphere Application Server - HTTPClient - SSL Peer unauthenticated

postman - 我们可以在使用 POSTMAN 时添加 TLS 1.2 版吗?

java - Java 11 上的 SSL 协议(protocol)异常

node.js - 如何在 NodeJS 中安装 GoDaddy SSL 证书?

ssl - Kubernetes Ingress SSL 证书问题

java - 多个 HttpAsyncClient 被认为是一种不好的做法吗?

java - 如何在 Alpine docker 容器上使用 openjdk 14 启用 ECDHE 密码?