Rails + paperclip + S3 + OSX = OpenSSL错误

时间:2012-03-26 20:39:12

标签: ruby-on-rails-3 amazon-s3 openssl paperclip

我正在尝试使用AWS在开发中发布到S3,但它无法找到我的ssl包。我为Oauth安装了它,一旦我告诉它它在哪里,它工作正常。我似乎无法配置AWS以正确查看它。

OpenSSL::SSL::SSLError:
  SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

这是我模特的配置:

has_attached_file :image, 
  :styles => { ... }, 
  :storage => :s3,
  :s3_credentials => {
    :access_key_id     => ACCESS_KEY,
    :secret_access_key => SECRET_KEY,
    :bucket => BUCKET,
    :ssl_ca_file => '/opt/local/share/curl/curl-ca-bundle.crt'
  }

我尝试添加:ssl_verify_peer => false:use_ssl => false。这两项工作都没有,这让我觉得我在错误的地方配置AWS gem。有什么建议在哪里/我应该这样做?

我正在使用paperclip 2.4.0和aws-sdk 1.3.8

我还应该提一下,在使用rspec进行测试时会出现错误。

2 个答案:

答案 0 :(得分:1)

在github aws-sdk页面的帮助下计算出来:https://github.com/amazonwebservices/aws-sdk-for-ruby

简而言之,我必须创建一个看似......的特定config/initializers/aws.rb

# load the libraries
require 'aws'
# log requests using the default rails logger
AWS.config(:logger => Rails.logger)
# load credentials from a file
config_path = File.expand_path(File.dirname(__FILE__)+"/../aws.yml")
AWS.config(YAML.load(File.read(config_path)))

我必须做的就是将我的config/s3.yml文件移到config/aws.yml。然后更改我的模型以使用该yml文件...

has_attached_file :image, 
:styles => { ... }, 
:storage => :s3,
:s3_credentials => "#{Rails.root.to_s}/config/aws.yml"

并且照顾它。我怀疑,使用s3_credentials通过paperclip设置ssl属性不起作用,因为已经加载了aws对象。

为了完整起见,这是yml文件......

development:
  access_key_id: ...
  secret_access_key: ...
  bucket: bucket_name
  ssl_ca_file: /opt/local/share/curl/curl-ca-bundle.crt
test:
  access_key_id: ...
  secret_access_key: ...
  bucket: bucket_name
  ssl_ca_file: /opt/local/share/curl/curl-ca-bundle.crt
production:
  access_key_id: ...
  secret_access_key: ...
  bucket: bucket_name

答案 1 :(得分:0)

你的水桶名称是什么?

如果你使用像foo.domain.com这样的东西作为存储桶,回形针将使用它作为主机名的前缀(foo.domain.com.aws.amazon.com),这将导致SSL验证问题。

尝试使用与主机名不相似的存储桶名称,例如mydomain-photos

确定网址的代码位于fog.rb:

      if fog_credentials[:provider] == 'AWS'
        if @options[:fog_directory].to_s =~ Fog::AWS_BUCKET_SUBDOMAIN_RESTRICTON_REGEX
          "https://#{@options[:fog_directory]}.s3.amazonaws.com/#{path(style)}"
        else
          # directory is not a valid subdomain, so use path style for access
          "https://s3.amazonaws.com/#{@options[:fog_directory]}/#{path(style)}"
        end
      else
        directory.files.new(:key => path(style)).public_url
      end

那个正则表达式是:

     AWS_BUCKET_SUBDOMAIN_RESTRICTON_REGEX = /^(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/