Ruby on rails 3 轨道&x2B;回形针&x2B;S3和x2B;OSX=OpenSSL错误
我试图在开发中使用AWS发布到S3,但它找不到我的ssl包。我已经为Oauth安装了它,一旦我告诉它它在哪里,它就可以正常工作了。但我似乎无法配置AWS以正确查看它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
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照片中没有点通过正则表达式。下划线或大小写混合将失败,是更好的选择。