首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在连接到SSL_connect returned=1 errno=0 state=error时获取“证书验证失败”

在连接到SSL_connect returned=1 errno=0 state=error时获取“证书验证失败”
EN

Stack Overflow用户
提问于 2016-05-16 15:13:57
回答 4查看 14.4K关注 0票数 7

我一直试图上传一张照片到我的AWS桶,但遇到了标题中提到的错误。我知道这很可能与我的OpenSSL证书有关,但我尝试过的任何建议解决方案到目前为止都失败了。

我在OSX Yosemite上遇到了ruby 2.3.1、Rails 4.1.8、aws core 2.3.4和载波0.11.0的问题。

我也尝试过在这个类似的问题上找到所有可用的东西,就像其他问题一样(这个问题与Windows一起):https://github.com/aws/aws-sdk-core-ruby/issues/166#issuecomment-111603660

以下是我的一些文件:

carrierwave.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
class AvatarUploader < CarrierWave::Uploader::Base

  storage :aws

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

编辑(更多信息):

代码语言:javascript
复制
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!
  • 手动下载证书和参考资料
  • 我试着用雾代替载波-aws
  • 升级rbenv后尝试重新安装ruby

这是…的结果

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-20 18:41:45

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

  • 您的openssl安装没有验证其可信证书存储中的Amazon服务器所需的证书链.
  • ...which是应该通过向初始化器根据医生的说法添加Aws.use_bundled_cert!来解决的确切情况。但是在这种情况下,它不能工作,因为即使这个命令指示ruby库从aws-sdk-core gem的CA包文件向受信任的存储添加各种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下工作的具体步骤,请参阅解决方案节这个问题
  • 此外,由于您使用的是分叉的aws-sdk-ruby gem存储库,您也可以通过自己添加中间CA证书来更新aws-sdk-ruby 在你的回购中存档 (根CA证书似乎已经存在于包中)。为此,您需要执行以下操作:
代码语言:javascript
复制
- download the intermediate CA cert from the official page of the [DigicertCA certificates](https://www.digicert.com/digicert-root-certificates.htm) (you can as well use the direct link above, but to obey security rules precisely you should also check the fingerprints)
- convert it to the PEM format (it gets downloaded in DER format) and add it to the cert bundle using the following openssl command:

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

运行此命令后,您的ca-bundle.crt应该在文件末尾包含中间CA证书。

现在只需将更新后的包文件推送到您的回购程序中,Aws.use_bundled_cert! 就应该开始工作了!

-如果你关心的话,最好的办法也是在aws-sdk-ruby创业板上开始发行github,这样他们也可以在回购中更新证书包.

票数 6
EN

Stack Overflow用户

发布于 2016-05-20 02:15:16

您的Ruby代码、AWS等都很好。这不是Ruby或SDK问题。您最初描述的错误消息以及稍后发布的OpenSSL连接日志都指出了问题的根源: OpenSSL框架中缺少根证书和/或配置不当的CA cert包。另一条线索是,相同的代码可以用于生产。不是密码问题。

原始错误消息本身指向您所指示的OpenSSL证书验证错误。堆栈跟踪还显示了2.3.1/ lib / Ruby /2.3.0/net/http.rb中的ruby内部库错误。这是利用OpenSSL框架的核心网络库。

openssl s_client连接日志更清楚地显示了扩展错误号和消息:

代码语言:javascript
复制
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

在使用openssl的客户端测试在巴尔的摩CA-2 CA上得到一个Verify return code: 0 (ok) 之前,您的代码将无法运行。

DigiCert巴尔的摩CA-2 CA证书不存在或未被计算机上的OpenSSL设置正确引用。这是OpenSSL安装失败或不完整时常见的问题。您需要下载该证书,转换为PEM格式,将其保存在OpenSSL证书文件夹中的ca-证书.ca文件中,然后在您的配置中引用该文件,或者在环境变量SSL_CERT_FILE中引用该文件。

您可以看到一个很好的解决根本问题这里的方法。

注意:为了进一步确认这个解决方案,您应该在生产服务器上运行openssl s_client测试。您应该看到它没有问题地验证相同的CA。检查OpenSSL配置和cert配置,以了解您的生产环境和开发环境之间存在差异的原因。

票数 4
EN

Stack Overflow用户

发布于 2020-06-22 05:41:43

此问题可能是由于无效证书造成的。调用URL(API)时

您可以先交叉验证证书。通过键入命令

代码语言:javascript
复制
openssl s_client -connect <url without https>:443

如果你在证书上发现任何问题。然后更新证书。在证书管理器可以修复此问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37257296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档