加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 连接到S3时获取“SSL_connect返回= 1 errno =

发布时间:2020-12-17 02:49:18 所属栏目:百科 来源:网络整理
导读:我一直试图将照片上传到我的AWS桶,但遇到了标题中提到的错误.我知道它很可能与我的OpenSSL证书有关,但我尝试过的任何建议的解决方案到目前为止都失败了. 我在OSX Yosemite上遇到了ruby 2.3.1,Rails 4.1.8,aws-sdk-core 2.3.4和carrierwave 0.11.0这个问题.
我一直试图将照片上传到我的AWS桶,但遇到了标题中提到的错误.我知道它很可能与我的OpenSSL证书有关,但我尝试过的任何建议的解决方案到目前为止都失败了.

我在OSX Yosemite上遇到了ruby 2.3.1,Rails 4.1.8,aws-sdk-core 2.3.4和carrierwave 0.11.0这个问题.

我已经尝试了在这个类似问题上找到的所有可用内容,就像其他人一样(这个是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

编辑(更多信息):

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'

解决方案:

> Aws.use_bundled_cert!
>手动下载证书和参考
>我尝试使用Fog而不是carrierwave-aws
>尝试升级rbenv后重新安装ruby

这是结果

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)

解决方法

随着@RodrigoM的调查帮助和你的问题更新,这一切都开始有意义了.实际上有两个不同的问题会导致您观察到的错误:

>您的openssl安装没有验证其受信任的证书商店中的Amazon服务器所需的证书链……
> …这是应该通过添加Aws.use_bundled_cert来解决的确切情况!到初始化程序,according to the docs.但在这种情况下,它不起作用,因为即使此命令指示ruby openssl库从aws-sdk-core gem的CA bundle file向受信任的存储添加各种CA证书,该文件也不包含适当的CA证书,因为它本身已有近2年的历史,已经过时了.中间CA证书CN=DigiCert Baltimore CA-2 G2已于2015年12月8日发布,因此难怪CA捆绑包文件不包含它.

现在,您有两种选择:

>您可以尝试将此中间CA证书(可能包括根CA证书(CN=Baltimore CyberTrust Root))安装到openssl受信任证书库.这应该使s_client命令工作.但是,您可能仍会遇到使用ruby代码中的这些受信任证书的问题.有关在OSX上使其在ruby下工作的具体步骤,请参阅this SO question的解决方案部分.
>此外,由于您无论如何都使用了分叉的aws-sdk-ruby gem存储库,您也可以通过自己添加中间CA证书来更新ca-bundle.crt file in your repo(根CA证书似乎已经存在于捆绑包中).为此,您需要执行以下操作:

>从DigicertCA certificates的官方页面下载中间CA证书(您也可以使用上面的直接链接,但要严格遵守安全规则,您还应检查指纹)
>将其转换为PEM格式(以DER格式下载)并使用以下openssl命令将其添加到cert包中:

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

运行此命令后,您的ca-bundle.crt应包含文件末尾的中间CA证书.>现在只需将此更新的捆绑文件推送到您的仓库和Aws.use_bundled_cert!应该开始工作了!>如果您关心,也许最好也是在aws-sdk-ruby gem上启动github问题,以便他们也在他们的repo中更新cert包…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读