【问题标题】:Amazon Secrets Manager, Java 7, and CipherSuitesAmazon Secrets Manager、Java 7 和 CipherSuites
【发布时间】:2019-06-17 21:29:47
【问题描述】:

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

【问题讨论】:

  • 您应该启用 ssl 调试输出以查看正在发送的密码套件。并确保您已安装 JCE Unlimited Strength Jurisdiction Policy Files。
  • 我们已经做到了。 JCE Unlimited Strength 还不够,您还必须在程序级别启用套件。如果有办法从程序外部启用它们,我还没有找到。
  • 对于 https,您可以从 java vm 命令行设置系统属性,请参阅customizing JSSE。 Java 7 应该支持现代密码套件。
  • 尝试了 https.cipherSuites 和 https.protocols 系统属性,我认为您正在理解。这些似乎依赖于 http 客户端实现。 AWS Secrets Manager 使用 Apache HTTP 客户端 (httpclient-4.5.7) 似乎没有使用这些。

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


【解决方案1】:

经过多次头撞后,我想出了以下代码:

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

客户端随后用于请求。

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 2023-02-14
    • 2021-07-24
    • 2023-01-01
    • 1970-01-01
    • 2020-07-22
    • 2019-02-15
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多