Amazon S3
,使用rails
和fog
。尝试使用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 有一些东西
我已经试过了:
我已经尝试过在
application.rb
中这样配置证书:但没有成功。AWS.config(:http_handler=>AWS::http::HTTPartyHandler.new(:ssl_ca_a_path=>"/etc/ssl/certs")
还从这里在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格式:
- 路径样式方法(已弃用)
- 虚拟托管-样式方法
现在的情况是:
- Fog正在尝试向您的bucket请求一个URL,如:
https://myproject.de.s3-us-west-2.amazonaws.com/foo/bar
- 请求中的主机名为
myproject.de.s3-us-west-2.amazonaws.com
- 在SSL TLS协商期间提供
*.amazonaws.net
的SSL证书 - Fog尝试验证SSL Cert&CA证书链
- Fog尝试将证书的CN
*.s3.amazonaws.com
与myproject.de.s3-us-west-2.amazonaws.com
进行匹配 - 根据RFC 2818中的证书CN通配符匹配规则,子域与通配符CN:
*.s3.amazonaws.com
不匹配 - 由于SSL证书CA验证无效,与
hostname does not match the server certificate
的连接失败
S3 URL中的点问题在互联网上被提及,例如在Drupal项目、AWS论坛、Python Boto库中,并在这篇题为:Amazon S3 Gotcha:使用HTTPS的虚拟主机URL<的博客文章中得到了很好的解释我强烈建议阅读这篇文章,以便进一步澄清
问题出在bucket
的naming
上,在这种情况下: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名称不能包含句点(.)。
进一步的参考在这里