当前位置: 首页 > 面试题库 >

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

方和宜
2023-03-14
问题内容

Amazon在其1.3.21版本的AWS Java SDK中“升级”了SSL安全性。使用Amazon的AWS Java
API时,这将无法访问名称中带有句点的所有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论坛上查看有关此问题的文档:

https://forums.aws.amazon.com/thread.jspa?messageID=387508

亚马逊对此问题的回应如下。

对于具有此命名模式的存储桶,我们应该能够使用存储桶寻址的较旧路径样式方法(而不是较新的虚拟主机样式寻址)来解决此问题。我们将开始修复此问题,并确保我们的内部集成测试具有包含时段的存储桶名称的测试用例。

任何解决方法或其他解决方案?感谢您的任何反馈。


问题答案:

亚马逊发布了1.3.22版本,此版本解决了此问题。我已验证我们的代码现在可以正常工作了。引用其发行说明:

现在可以通过HTTPS再次正确寻址名称包含句点的存储桶。

除了等待亚马逊发布新的API之外,我还可以看到几种解决方案。

  1. 显然,您可以回滚到AWS Java SDK的1.3.20版本。不幸的是,我需要1.3.21中的某些功能。

  2. 您可以org.apache.http.conn.ssl.StrictHostnameVerifier在类路径中替换。但是,这是一个 hack ,它将删除我认为对Apache http连接的所有SSL检查。这是对我有用的代码:http : //pastebin.com/bvFELdJE

  3. 我最终从AWS源jar下载并构建自己的软件包。我对HttpClientFactory源应用了以下近似补丁。

    ===================================================================
    

    — src/main/java/com/amazonaws/http/HttpClientFactory.java (thirdparty/aws) (revision 20105)
    +++ src/main/java/com/amazonaws/http/HttpClientFactory.java (thirdparty/aws) (working copy)
    @@ -93,7 +93,7 @@

                        SSLSocketFactory sf = new SSLSocketFactory(
                                SSLContext.getDefault(),
    
    • SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
    • SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  4. 正确的解决方法是将域名存储桶处理更改为基于路径的处理。

顺便说一句,下面的内容似乎可行,但 无效 。AWS客户端专门请求STRICT验证者,并且不使用默认验证者:

SSLSocketFactory.getSystemSocketFactory().setHostnameVerifier(
    SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);


 类似资料:
  • 问题内容: 我尝试使用自签名证书连接到服务器。我使用此代码接受所有证书。 但是尽管如此,我收到以下错误: 我确定我的证书代码已执行,那么可能是什么问题? 问题答案: 您可以使用

  • 我试图从java调用Heroku的开发人员api,但是我得到了以下异常: 我的代码如下所示: https://stackoverflow.com/a/7266768 https://stackoverflow.com/a/3904473 https://stackoverflow.com/a/25356821 建议我应该重写证书主机名检查,这肯定违背了这一点(当然生产还没有准备好)?

  • 问题内容: 我一直在使用以下代码连接到Google的服务之一。这段代码在我的本地机器上运行良好: 我将这段代码放到了已阻止Google.com的生产环境中。根据要求,他们允许我访问IP:74.125.236.52,这是Google的IP之一,从而允许与Google服务器通信。我编辑了主机文件,也添加了该条目。 仍然无法访问URL,我想知道为什么。所以我将上面的代码替换为: 现在我得到这样的错误:

  • 我有一个httpsendpoint,我需要从wso2 API管理器访问它。(使用1.10)。我已经将证书文件添加到“client-truststore.jks”文件中。但现在它给出了如下错误。 我已经更新了Axis2.xml文件,如下所示。 如何使用WSO2 APIManager解决此问题以访问此https后端服务

  • 我被困在如何修复这个SSL错误上—— 我的SSL证书在Chrome上运行良好,但在Safari和Firefox上,如果我去www.domain.com而不是domain.com,就会出现主机名不匹配的错误 我已经使用Certbot为我的domain.com和www.domain.com域设置了SSL证书 当我在nginx上检查以确保证书存在时,我运行< code>sudo certbot - ng

  • 问题内容: 我在Android上使用HttpClient连接到https://someUrl.com/somePath。问题在于该站点的证书用于* .someUrl.com,而不是someUrl.com,因此我得到了SSLException。是的,网站上有些脚,是的,但是除非我能解决问题,否则我将陷入困境。有没有办法让HttpClient放松并接受证书? 问题答案: 这是我的(编辑)解决方案: 除