Rails + скрепка + S3 + OSX = ошибка OpenSSL - PullRequest
0 голосов
/ 27 марта 2012

Я пытаюсь опубликовать на S3, используя AWS в разработке, но он не может найти мой пакет 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 не в том месте. Любые предложения, где / как я должен делать это?

Я использую скрепку 2.4.0 и aws-sdk 1.3.8

Следует также отметить, что ошибка возникает при тестировании с помощью rspec.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Разобрался с помощью страницы 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"

И это позаботилось об этом.Как я и подозревал, установка свойств ssl через paperclip с использованием s3_credentials не сработала, потому что объект 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
0 голосов
/ 27 марта 2012

Как тебя зовут?

Если вы используете что-то вроде foo.domain.com в качестве корзины, paperclip будет использовать это в качестве префикса для имени хоста (foo.domain.com.aws.amazon.com), что вызовет проблемы с проверкой SSL.

Попробуйте использовать имя группы, которое не похоже на имя хоста, например 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

и это регулярное выражение:

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