Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 轨道&x2B;回形针&x2B;S3和x2B;OSX=OpenSSL错误_Ruby On Rails 3_Amazon S3_Openssl_Paperclip - Fatal编程技术网

Ruby on rails 3 轨道&x2B;回形针&x2B;S3和x2B;OSX=OpenSSL错误

Ruby on rails 3 轨道&x2B;回形针&x2B;S3和x2B;OSX=OpenSSL错误,ruby-on-rails-3,amazon-s3,openssl,paperclip,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, :s

我试图在开发中使用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\u verify\u peer=>false
,以及
:use\u ssl=>false
。这两个都不起作用,这让我觉得我在错误的地方配置了AWS gem。有什么建议我应该在哪里/怎样做

我使用的是回形针2.4.0和aws sdk 1.3.8


我还应该提到,错误发生在使用rspec进行测试时。

您的bucket名称是什么

如果使用foo.domain.com之类的内容作为存储桶,则曲别针将使用该内容作为主机名的前缀(foo.domain.com.aws.amazon.com),这将导致SSL验证出现问题

尝试使用与主机名不相似的bucket名称,如
mydomain photos

用于确定url的代码位于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
而regex是:

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

在github aws sdk页面的帮助下解决了这个问题:

简而言之,我必须创建一个特定的
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"
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
这就解决了问题。正如我所怀疑的,使用s3_凭据通过回形针设置ssl属性不起作用,因为aws对象已经加载

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

has_attached_file :image, 
:styles => { ... }, 
:storage => :s3,
:s3_credentials => "#{Rails.root.to_s}/config/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

啊,很有趣,但是bucket name
domain_env
mydomain照片中没有点通过正则表达式。下划线或大小写混合将失败,是更好的选择。