亚马逊S3 - 主机名与服务器证书不匹配 (OpenSSL::SSL::SSLError) + Rails

22
< p >Amazon S3, 使用railsfog。 尝试使用rake assets:precompile预编译我的资源:

信息:

[WARNING] fog: followed redirect to myproject.de.s3-us-west-2.amazonaws.com, connecting to the matching region will be more performant
rake aborted!
hostname does not match the server certificate (OpenSSL::SSL::SSLError)

所以 OpenSSL 有些问题。

我已经尝试了以下措施:

  1. 我已经在 application.rb 中尝试配置证书,就像这样:但没有成功。

    AWS.config(:http_handler => AWS::Http::HTTPartyHandler.new(:ssl_ca_path => "/etc/ssl/certs"))

  2. 还从此处在 Ubuntu 12.04 上安装了 openssl

问题是:Amazon S3 如何处理证书


它可以不使用SSL工作吗?你在使用jruby吗? - aarti
3个回答

26

实际上,您可以使用带有点的存储桶名称。您需要做的是将 :path_style => true 添加到您的 config.fog_credentials 中。

在您的示例中,它会变成:

config.fog_credentials = {
   :provider              => 'AWS',
   :aws_access_key_id     => ENV['S3_KEY'],
   :aws_secret_access_key => ENV['S3_SECRET'],
   :region                => ENV['S3_REGION'],
   :path_style            => true
}

config.fog_directory    = "myproject.de"

或者在资产同步初始化器中添加 Fog.credentials = { path_style: true } - Gaurav Shah
2
:region 也需要设置,就像你的示例一样。如果没有指定区域,AWS可能会发出301重定向回到无效的bucket-name样式地址,带有点号(而不是路径样式地址)。 - MarkWPiper

17

简述解决方案

为了通过httpS访问您的S3存储桶URL,您需要选择以下两种方式之一:

  • 选择不包含点“.”的存储桶名称,并使用“虚拟主机风格”URL,例如:
    https://simplebucketname.s3.amazonaws.com/myObjectKey
    或者
  • 使用指定存储桶名称的“路径风格”URL格式,例如:
    https://s3.amazonaws.com/mybucket.mydomain.com/myObjectKey

使用fog,您可以设置选项::path_style => true,如此解决方案所述。

问题和说明

SSL证书验证问题是由于在S3 Bucket名称中使用点“.”与“虚拟主机风格方法”URL格式一起使用而引起的。

Amazon S3文档指出,它允许两种主要的URL格式来访问S3 Buckets和Objects:

  1. 路径样式方法(已弃用
  2. 虚拟主机风格方法

所以正在发生的事情是这样的:

1. Fog正在尝试请求您的存储桶URL,例如:https://myproject.de.s3-us-west-2.amazonaws.com/foo/bar 2. 请求中的主机名为myproject.de.s3-us-west-2.amazonaws.com 3. SSL证书用于SSL TLS协商期间的*.amazonaws.net 4. Fog尝试验证SSL证书和CA证书链 5. Fog尝试将证书的CN *.s3.amazonaws.commyproject.de.s3-us-west-2.amazonaws.com匹配 6. 根据RFC 2818中的证书CN通配符匹配规则,子域名不匹配通配符CN:*.s3.amazonaws.com 7. 由于无效的SSL证书CA验证,连接失败并显示hostname does not match the server certificate
在互联网上,S3 URL中的点问题被提到很多次,例如在Drupal项目AWS论坛Python Boto库等地方,并且在这篇博客文章中得到了很好的解释:Amazon S3 Gotcha: 使用虚拟主机URL与HTTPS <--我强烈建议阅读此文章以获得进一步的澄清。

-4

问题出在bucketnaming上,例如: myproject.de 这种格式,Amazon S3服务不认为它是有效的(名称中不能有点号)。

我已经将bucket的名称从myproject.de改为myprojectde,现在可以正常使用了。

Bucket 命名规则

除美国标准地区外,存储桶名称必须遵守以下规则,以确保符合 DNS 标准: 存储桶名称长度必须为 3 到 63 个字符; 存储桶名称必须由一个或多个标签组成,标签之间用句点(.)分隔,每个标签必须满足以下条件: - 必须以小写字母或数字开头; - 必须以小写字母或数字结尾; - 可以包含小写字母、数字和短横线; 存储桶名称不能格式化为 IP 地址(例如 192.168.5.4)。 以下是有效存储桶名称的示例: myawsbucket my.aws.bucket myawsbucket.1 以下是无效存储桶名称的示例: Invalid Bucket Name Comment .myawsbucket 存储桶名称不能以句点(.)开头。 myawsbucket. 存储桶名称不能以句点(.)结尾。 my..examplebucket 标签之间只能有一个句点(.)。
请注意,如果您想使用虚拟主机样式请求访问存储桶(例如http://mybucket.s3.amazonaws.com),并且是通过 SSL,存储桶名称不能包含句点(.)。
更多参考请看这里

5
这不正确。Bucket名称 myproject.de 是一个合法的Bucket名称。在某些情况下,Bucket名称必须包含句点。(来自Amazon文档http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html):“在此步骤中,您将使用AWS帐户凭据登录Amazon S3控制台,并创建以下两个Bucket:example.com和www.example.com”。 - Undistraction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接