Amazon S3 - 主机名与服务器证书(OpenSSL :: SSL :: SSLError)+ rails不匹配

mar*_*k10 21 ruby-on-rails amazon-s3

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)
Run Code Online (Sandbox Code Playgroud)

所以OpenSSL有一些东西

我已经尝试过了:

  1. 我已经尝试过application.rb像这样配置证书:没有成功.

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

  2. openssl这里安装在Ubuntu 12.04上

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

PEF*_*PEF 24

实际上,您可以使用带点的存储桶名称.你所要做的就是加入: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"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,:path_style就像一个魅力! (3认同)
  • `:region` _ALSO_ 需要设置,如您的示例所示。如果未指定区域,AWS 可能会发出 301 重定向回无效的存储桶名称样式地址,并带有点(而不是路径样式地址)。 (2认同)

Tri*_*onX 12

TLDR; 解

要通过http S访问S3存储桶URL ,您需要:

  • 选择一个存储桶名称,使其不包含句点' .',并使用" 虚拟主机样式 "URL,例如
    https://simplebucketname.s3.amazonaws.com/myObjectKey
    OR
  • 使用" 路径样式 "URL表单,在主机名后单独指定存储桶名称,例如:
    https://s3.amazonaws.com/mybucket.mydomain.com/myObjectKey

有了fog,您可以设置该选项::path_style => true作为该解决方案解释.

问题与解释

SSL证书验证问题源于.在S3存储桶名称中使用点' '以及"虚拟托管样式方法"URL格式.

亚马逊S3文档说,它允许两个主URL格式用于访问S3铲斗和对象:

  1. 路径样式方法
  2. 虚拟托管式方法

所以发生了什么:

  1. 雾正试图请求您的桶的URL,如: https://myproject.de.s3-us-west-2.amazonaws.com/foo/bar
  2. 请求中的主机名是 myproject.de.s3-us-west-2.amazonaws.com
  3. *.amazonaws.net在SSL TLS协商期间提供SSL 证书
  4. 雾试图验证SSL证书和CA证书链
  5. 雾尝试匹配的证书的CN *.s3.amazonaws.com反对myproject.de.s3-us-west-2.amazonaws.com
  6. 根据证书CN通配符匹配规则RFC 2818,子子域名不匹配通配符CN:*.s3.amazonaws.com
  7. hostname does not match the server certificate由于无效的SSL证书CA验证,连接失败

互联网上提到了S3 URL问题中的点,例如Drupal项目,AWS论坛,Python Boto库,这篇博客文章中详细解释了这一点:Amazon S3 Gotcha:使用带有HTTPS的虚拟主机URL < - I建议阅读本文以进一步澄清.


mar*_*k10 -4

问题在于namingof bucket,在本例中为 : myproject.de,这是 Amazon S3 服务认为无效的格式。(名称中没有点)。

我已将存储桶的名称更改为myproject.demyprojectde现在可以使用了。

桶命名规则

在除美国标准区域之外的所有区域中,存储桶名称必须符合以下规则。这会产生符合 DNS 的存储桶名称。

存储桶名称的长度必须至少为 3 个且不超过 63 个字符

存储桶名称必须是一系列由句点 (.) 分隔的一个或多个标签,其中每个标签:

必须以小写字母或数字开头

必须以小写字母或数字结尾

可以包含小写字母、数字和破折号

存储桶名称不得采用 IP 地址格式(例如 192.168.5.4)

以下是有效存储桶名称的示例:

米亚斯桶

my.aws.bucket

myawsbucket.1

以下是无效存储桶名称的示例:

无效的存储桶名称注释 .myawsbucket 存储桶名称不能以句点 (.) 开头。myawsbucket。存储桶名称不能以句点 (.) 结尾。my..examplebucket 标签之间只能有一个句点

请注意,如果您想要使用虚拟托管式请求访问存储桶,例如通过 SSL 访问http://mybucket.s3.amazonaws.com,则存储桶名称不能包含句点 (.)。

进一步的参考在这里

  • 这是不正确的。存储桶名称“myproject.de”是有效的存储桶名称。在某些情况下,存储桶名称必须包含句点。(来自 Amazon Docs http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html):“在此步骤中,您将使用您的 AWS 账户凭证登录 Amazon S3 控制台并创建以下两个存储桶:example.com 和 www.example.com' (5认同)