【发布时间】: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