Amazon在1.3.21版本的AWS中“升级”了SSL安全性。当使用亚马逊的时,这破坏了对任何有句点的S3桶的访问。我使用的是1.3.21.1版,目前的版本是2012年10月5日。我在下面的回答中提供了一些解决方案,但我正在寻找更多的工作来解决这个问题。
如果您收到此错误,您将在异常/日志中看到类似以下消息。在本例中,桶名为foo.example.com。
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讨论论坛上看到有关此问题的文档:
亚马逊对这个问题的反应如下。
我们应该能够通过使用存储桶寻址的旧路径样式方法(而不是更新的虚拟主机样式寻址)来修复这个问题。我们将开始修复,并确保我们的内部集成测试有包含句点的桶名的测试用例。
有什么解决办法或其他解决办法吗?谢谢你的反馈。
发布于 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发行版放在前面。
发布于 2012-10-05 22:51:17
Amazon发布了1.3.22版本,解决了这个问题。我已经证实我们的代码现在起作用了。引用他们的新闻稿说明:
名称包含句点的桶现在可以在HTTPS上再次正确地寻址。
除了等待Amazon发布新的API之外,我还可以看到一些解决方案。
org.apache.http.conn.ssl.StrictHostnameVerifier。不过,这是一个黑客,它将删除Apache http连接的所有SSL检查。下面是对我有用的代码:http://pastebin.com/bvFELdJEHttpClientFactory源代码应用了下面的近似修补程序。
===================================================================- SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);+ SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);顺便说一句,下面的内容似乎是可行的,但却行不通。AWS客户端专门请求STRICT验证器,而不使用默认的验证器:
SSLSocketFactory.getSystemSocketFactory().setHostnameVerifier(
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);https://stackoverflow.com/questions/12755038
复制相似问题