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



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_a_path=>"/etc/ssl/certs")

  2. 还从这里在Ubuntu 12.04上安装了openssl

问题是:AmazonS3如何处理证书

实际上,您可以使用带点的bucket名称。您所要做的就是将: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"

TLDR;解决方案

为了通过httpS访问S3存储桶URL,您需要:

  • 选择一个bucket名称,使其不包含句点".";虚拟托管-风格;URL,例如
    https://simplebucketname.s3.amazonaws.com/myObjectKey

  • 使用";路径样式";URL表单,在主机名之后单独指定存储桶名称,例如:
    https://s3.amazonaws.com/mybucket.mydomain.com/myObjectKey

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

问题&解释

SSL证书验证问题是由于在S3桶名称中使用点"CCD_;虚拟托管-风格方法";URL格式。

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

  1. 路径样式方法(已弃用)
  2. 虚拟托管-样式方法

现在的情况是:

  1. Fog正在尝试向您的bucket请求一个URL,如:https://myproject.de.s3-us-west-2.amazonaws.com/foo/bar
  2. 请求中的主机名为myproject.de.s3-us-west-2.amazonaws.com
  3. 在SSL TLS协商期间提供*.amazonaws.net的SSL证书
  4. Fog尝试验证SSL Cert&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:使用HTTPS的虚拟主机URL<的博客文章中得到了很好的解释我强烈建议阅读这篇文章,以便进一步澄清

问题出在bucketnaming上,在这种情况下:myproject.de,这是亚马逊S3服务认为无效的格式。(名称中没有点)。

我已经将bucket的名称从myproject.de更改为myprojectde,现在它可以工作了。

Bucket命名规则

在除美国标准地区外的所有地区中,存储桶名称必须遵守以下规则。这些导致DNS兼容bucket名称。

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

Bucket名称必须是一系列一个或多个标签,由周期(.),其中每个标签:

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

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

可以包含小写字母、数字和短划线

桶名称不能被格式化为IP地址(例如。,192.168.5.4)

以下是有效bucket名称的示例:

myawsboot

my.aws.bucket

myawsbbucket.1

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

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

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

进一步的参考在这里

最新更新