2016-05-16 4 views
4

Я пытаюсь загрузить фотографию в свой ковш AWS, но столкнулся с ошибкой, упомянутой в заголовке. Я понимаю, что это скорее всего связано с моими сертификатами OpenSSL, но любое предлагаемое решение, которое я пробовал, до сих пор не удалось.Получение «SSL_connect возвращено = 1 errno = 0 state = ошибка: проверка сертификата не удалась» при подключении к S3

Я столкнулся с этой проблемой с ruby ​​2.3.1, Rails 4.1.8, aws-sdk-core 2.3.4 и несущей волной 0.11.0 на OSX Yosemite.

Я попробовал все доступные найти на этой подобной проблеме, а также, как и другие (это один быть с Windows): https://github.com/aws/aws-sdk-core-ruby/issues/166#issuecomment-111603660

Вот некоторые из моих файлов:

carrierwave.rb

CarrierWave.configure do |config|      # required 
    config.aws_credentials = { 
    access_key_id:  Rails.application.secrets.aws_access_key_id, # required 
    secret_access_key: Rails.application.secrets.aws_access_key, # required 
    region:   'eu-west-2'     # optional, defaults to 'us-east-1' 
    } 

    config.aws_bucket = Rails.application.secrets.aws_bucket      # required 
    config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" } # optional, defaults to {} 
end 

avatar_uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base 

    storage :aws 

    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
end 

EDIT (подробнее):

stack trace: 

    Seahorse::Client::NetworkingError - SSL_connect returned=1 errno=0 state=error: certificate verify failed: 
    /Users/stevenharlow/.rbenv/versions/2.3.1/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock' 
    /Users/stevenharlow/.rbenv/versions/2.3.1/lib/ruby/2.3.0/net/http.rb:933:in `connect' 
    /Users/stevenharlow/.rbenv/versions/2.3.1/lib/ruby/2.3.0/net/http.rb:863:in `do_start' 
    /Users/stevenharlow/.rbenv/versions/2.3.1/lib/ruby/2.3.0/net/http.rb:858:in `start' 
    /Users/stevenharlow/.rbenv/versions/2.3.1/lib/ruby/2.3.0/delegate.rb:83:in `method_missing' 
    aws-sdk-core (2.3.4) lib/seahorse/client/net_http/connection_pool.rb:292:in `start_session' 
    aws-sdk-core (2.3.4) lib/seahorse/client/net_http/connection_pool.rb:104:in `session_for' 
    aws-sdk-core (2.3.4) lib/seahorse/client/net_http/handler.rb:109:in `session' 

Solutions пытался:

  • Aws.use_bundled_cert!
  • Скачать сертификат и ссылки вручную
  • Я попытался с помощью Fog вместо carrierwave-AWS
  • Пробовал переустановить рубин после обновления rbenv

Вот результат

CONNECTED(00000003) 
depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Baltimore CA-2 G2 
verify error:num=20:unable to get local issuer certificate 
verify return:0 
--- 
Certificate chain 
0 s:/C=US/ST=Washington/L=Seattle/O=Amazon.com Inc./CN=*.s3-us-west-2.amazonaws.com 
    i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Baltimore CA-2 G2 
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Baltimore CA-2 G2 
    i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root 
--- 

<certificate info> 

No client certificate CA names sent 
--- 
SSL handshake has read 2703 bytes and written 456 bytes 
--- 
New, TLSv1/SSLv3, Cipher is AES128-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : AES128-SHA 
    Session-ID: <session-id> 
    Session-ID-ctx: 
    Master-Key: <master-key> 
    Key-Arg : None 
    Start Time: 1463697130 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 
+0

, что происходит, когда вы добавляете "use_ssl: true" в хэш aws_credentials? –

+0

неверный параметр конфигурации ': use_ssl ' Я использую драгоценный камень" carrierwave-aws ", а не туман –

+0

Очевидно, вы видели связанную [github issue] (https://github.com/aws/aws-sdk-core -ruby/issues/166 # issuecomment-219312958), поэтому вы попробовали 'Aws.use_bundled_cert!'. Не могли бы вы рассказать о своих попытках задать вопрос? И можете ли вы добавить полную трассировку стека ошибки? Кроме того, что вызывает загрузку - это загрузка файла из Интернета или что-то более сложное, как фоновое задание? Благодарю. – BoraMa

ответ

3

С помощью следственной помощи @RodrigoM и вашего обновления вопроса все это стало иметь смысл. Есть на самом деле две различных проблем, которые способствуют ошибкам вы замечаете:

  • Вашей установка OpenSSL не имеет цепочки сертификатов, необходимую для проверки сервера Amazon в доверенном CERTS магазине ...
  • ... который это точная ситуация, которая должна быть решена путем добавления Aws.use_bundled_cert! к инициализатору, according to the docs. Но в этом случае это не сработает, потому что, хотя эта команда указывает библиотеке ruby ​​openssl на добавление различных сертификатов CA в доверенное хранилище от aws-sdk-core gem's CA bundle file, , файл также не содержит надлежащего сертификата ЦС, поскольку он сам почти 2 лет и устарел. Промежуточный сертификат CA CN=DigiCert Baltimore CA-2 G2 был опубликован 8 декабря 2015 года, поэтому неудивительно, что файл пакета CA не содержит его.

Теперь у вас есть два варианта:

  • Вы можете попробовать установить этот промежуточный сертификат CA, вероятно, в том числе корневой CA CERT (CN=Baltimore CyberTrust Root), к вашему OpenSSL доверенной CERTS магазин. Это должно сделать команду s_client. Но вы все равно можете столкнуться с проблемами, используя эти доверенные сертификаты из ruby-кода. Для конкретных этапов его работы под рубином на OSX см. Решение раздел this SO question.

  • Кроме того, так как вы используете раздвоенный aws-sdk-ruby хранилище драгоценных камней в любом случае, вы можете также обновить ca-bundle.crt file in your repo путем добавления промежуточного CA Cert себя (корневой CA сертификат, кажется, уже присутствует в комплекте).Для этого вам нужно сделать следующее:

    • загрузить промежуточный CA сертификат с официальной страницы DigicertCA certificates (вы также можете использовать прямую ссылку выше, но подчиняться правилам безопасности именно вы должны также проверить отпечатки пальцев)
    • преобразовать его в формат PEM (он получает загружены в формате DER) и добавить его в CERT пачке с помощью следующей команды OpenSSL:

      openssl x509 -in DigiCertBaltimoreCA-2G2.crt -inform DER >> ca-bundle.crt 
      

      после выполнения этой команды, ваш ca-bundle.crt должен содержать промежуточный CA cer в конце файла.

    • Теперь просто нажмите этот обновленный файл пакета на свое репо, и Aws.use_bundled_cert! должен начать работать!

    • Если вы заботитесь, пожалуй, лучше всего было бы также начать выпуск GitHub на aws-sdk-ruby драгоценный камень так, чтобы они обновить пакет CERT в их репо тоже ...
+0

running: openssl s_client -connect s3-us-west-2.amazonaws.com:443 -CAfile DigiCertBaltimoreCA-2G2.crt из каталога Я добавил, что cert к результатам в том же ответе openssl ... –

+0

Я предполагаю, что на этот раз он терпит неудачу из-за корневого сертификата. Попробуйте весь комплект: '-CAfile ca-bundle.crt' после того, как вы добавили к нему промежуточный сертификат. – BoraMa

+0

У меня не было только DigiCertBaltimoreCA, но у меня даже не было оригинального ca-bundle.crt. Я схватил корневой сертификат и приложил к нему сертификат DCBCA, и теперь все работает отлично! Жизнь снова хороша :) –

0

Попробуйте использовать эти драгоценные камни и это установка вместо:

Gemfile

gem "carrierwave", "~> 0.11.0" 
gem 'carrierwave-aws', "~> 1.0.1" 
gem "unf", "~> 0.1.4" 

конфигурации/carrierwave.rb

require 'carrierwave' 
require 'carrierwave/orm/activerecord' 

    CarrierWave.configure do |config| 
    config.storage = :aws     # required 
    config.aws_bucket = Rails.application.secrets.aws_bucket  # required 
    config.aws_acl = :public_read 
    config.aws_credentials = { 
     access_key_id:  Rails.application.secrets.aws_access_key_id,  # required 
     secret_access_key: Rails.application.secrets.aws_access_key  # required 
    } 
    config.aws_attributes = { 
     cache_control: 'max-age=31536000', 
     expires: 1.year.from_now.httpdate 
    } 
    end 

* _uploader.rb

storage :aws 

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

# Use Heroku's temp folder for uploads 
def cache_dir 
    "#{Rails.root}/tmp/uploads" 
end 
3

Ваш код Ruby, AWS SDK и т. Д. Все в порядке. Это не проблема с Ruby или SDK. Сообщение об ошибке, которое вы изначально описываете, а ваша более поздняя публикация журнала подключения OpenSSL указывает на основную причину проблемы: Отсутствует корневой сертификат и/или неправильно настроенный пакет CA cert в среде OpenSSL. Еще одна подсказка заключается в том, что тот же код работает на производстве. Это не код.

Само исходное сообщение об ошибке указывает на ошибки проверки сертификата OpenSSL, как вы указываете. Трассировка стека также показывает внутренние ошибки Ruby в версии 2.3.1/lib/ruby ​​/ 2.3.0/net/http.rb.Это основная сетевая библиотека, которая использует структуру OpenSSL.

openssl s_client подключения журнала более четко показывает extact номер ошибки и сообщение:

depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Baltimore CA-2 G2 
verify error:num=20:unable to get local issuer certificate 

Пока вы не получите Verify return code: 0 (ok) на DigiCert Балтимор CA-2 CA с тест-клиента ВЛЯЕТСЯ OpenSSL, ваш код будет не работа.

Сертификат CA DigiCert Baltimore CA-2 CA отсутствует или неправильно указан в настройках OpenSSL на этом компьютере. Это очень распространенная проблема в сломанной или неполной установке OpenSSL. Вам необходимо загрузить этот сертификат, конвертировать в формат PEM, сохранить его в файле ca-certificate.crt в своей папке сертификатов OpenSSL, затем ссылаться на этот файл в вашей конфигурации или в переменной среды SSL_CERT_FILE.

Вы можете увидеть хорошее решение для вашего корневого вопроса here

ПРИМЕЧАНИЕ: Для того, чтобы futher подтвердить это решение, вы должны выполнить тест на производственном сервере openssl s_client. Вы должны увидеть, что он проверяет тот же СА без проблем. Проверьте конфигурацию конфигурации OpenSSL и CA cert, чтобы понять, почему существует разница между вашей производственной средой и средой разработки.

+0

running: openssl s_client -connect s3-us-west-2.amazonaws.com:443 -CAfile DigiCertBaltimoreCA-2G2.crt из каталога Я добавил, что cert к результатам в том же ответе openssl ... –

+0

Нечетно это не должно. Передайте этот файл DigiCertBaltimoreCA-2G2.crt, пожалуйста, чтобы проверить, чтобы подтвердить. Тот же тест проходит здесь. –

Смежные вопросы

 Смежные вопросы