首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java的S3/AWS存在SSL问题:“证书中的主机名不匹配”

使用Java的S3/AWS存在SSL问题:“证书中的主机名不匹配”
EN

Stack Overflow用户
提问于 2012-10-05 22:51:17
回答 2查看 9.4K关注 0票数 10

Amazon在1.3.21版本的AWS中“升级”了SSL安全性。当使用亚马逊的时,这破坏了对任何有句点的S3桶的访问。我使用的是1.3.21.1版,目前的版本是2012年10月5日。我在下面的回答中提供了一些解决方案,但我正在寻找更多的工作来解决这个问题。

如果您收到此错误,您将在异常/日志中看到类似以下消息。在本例中,桶名为foo.example.com

代码语言:javascript
复制
INFO: Unable to execute HTTP request: hostname in certificate didn't match:
       <foo.example.com.s3.amazonaws.com> != <*.s3.amazonaws.com>
       OR <*.s3.amazonaws.com> OR <s3.amazonaws.com>
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)
at org.apache.http.conn.ssl.StrictHostnameVerifier.verify(StrictHostnameVerifier.java:61)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)

您可以在AWS S3讨论论坛上看到有关此问题的文档:

񞦴

亚马逊对这个问题的反应如下。

我们应该能够通过使用存储桶寻址的旧路径样式方法(而不是更新的虚拟主机样式寻址)来修复这个问题。我们将开始修复,并确保我们的内部集成测试有包含句点的桶名的测试用例。

有什么解决办法或其他解决办法吗?谢谢你的反馈。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-06 02:29:51

原件:2012年10月

事实证明,亚马逊在2012年9月底对S3的SSL安全进行了“升级”。当使用亚马逊的时,这破坏了对任何有句点的S3桶的访问。

这不准确。S3的SSL通配符匹配与2006年S3推出时相同。更有可能的是,AWS团队启用了更严格的SSL证书验证(很好),但最终打破了与S3的SSL证书(bad)冲突的桶名。

正确的答案是,您需要使用路径样式的寻址,而不是DNS样式的寻址。这是解决SSL证书上通配符匹配问题的唯一安全方法。禁用验证将使您面临中间人攻击。

我目前不知道的是Java是否提供了一个可配置的选项。如果是的话,那就是你的答案。否则,Java团队就会说:“我们将添加这个特性,然后添加集成测试,以确保所有功能都能工作。”

更新:2020年10月

AWS已经宣布路径式的寻址将在不久的将来消失。AWS的建议是使用与DNS兼容的桶名,这意味着没有句点(除其他外)。S3的某些新特性需要与DNS兼容的桶名(例如加速传输)。

如果您需要一个包含句点的桶名(在不久的将来,新的存储桶也将被禁止使用),我最好的建议是,如果您想要在HTTPS上访问它,就将一个CloudFront发行版放在前面。

票数 9
EN

Stack Overflow用户

发布于 2012-10-05 22:51:17

Amazon发布了1.3.22版本,解决了这个问题。我已经证实我们的代码现在起作用了。引用他们的新闻稿说明:

名称包含句点的桶现在可以在HTTPS上再次正确地寻址。

除了等待Amazon发布新的API之外,我还可以看到一些解决方案。

  1. 显然,您可以回滚到1.3.20版本的AWS。不幸的是,我需要1.3.21中的一些特性。
  2. 您可以替换类路径中的org.apache.http.conn.ssl.StrictHostnameVerifier。不过,这是一个黑客,它将删除Apache http连接的所有SSL检查。下面是对我有用的代码:http://pastebin.com/bvFELdJE
  3. 最后,我从AWS源jar下载并构建了自己的包。我向HttpClientFactory源代码应用了下面的近似修补程序。 ===================================================================- SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);+ SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  4. 正确的解决方法是将域名桶处理更改为基于路径的处理。

顺便说一句,下面的内容似乎是可行的,但却行不通。AWS客户端专门请求STRICT验证器,而不使用默认的验证器:

代码语言:javascript
复制
SSLSocketFactory.getSystemSocketFactory().setHostnameVerifier(
    SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12755038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档