簡體   English   中英

證書錯誤SSL_connect返回= 1 errno = 0狀態=錯誤:證書驗證失敗

[英]certificate Error SSL_connect returned=1 errno=0 state=error: certificate verify failed

我正在使用ruby / rails應用程序,該應用程序通過rest / API從另一個ruby / rails應用程序接收一些信息。

第二個Rails應用具有以下地址: https : //railsapp2.domain.org (這是我在第一個應用中使用的授權URL)

但是當作業在我的第一個應用程序上運行時出現錯誤。

錯誤是:SSL_connect返回= 1 errno = 0狀態=錯誤:證書驗證失敗

而且我認為問題是因為我的應用中有以下代碼:

 def self.fetch(url)
   authorized_url = RemoteRequestBuilder.authorize_and_decorate!(url)

   RestClient.get(authorized_url, { accept: :json }) { |response, request, result, &block|
    raise SparcApiError unless response.code == 200

    @response = response
  }

  Yajl::Parser.parse @response
end

我尋找了一些答案,發現可以使用verify_ssl:false,但是我不知道在哪里使用它。 還有如何使用verify_ssl使它工作:true。

我還安裝了認證的gem,但它不會改變輸出。

我正在使用centOS7。

編輯

所以我做到了

   RestClient::Resource.new(
   authorized_url,
   :ssl_client_cert  => OpenSSL::X509::Certificate.new(File.read("/etc/certs/mycert.pem")),
   :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("/etc/private/mykey.key")),
   :ssl_ca_file      =>  "/etc/certs/mycert.pem",
   :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
   ).get(authorized_url, { accept: :json }) { |response, request, result, &block|
  raise SparcApiError unless response.code == 200

  @response = response
}

現在它給了我錯誤的get參數數目錯誤。

| 參數數量錯誤(0..1為2)/home/capistrano/opt/shared/bundle/ruby/2.1.0/gems/rest-client-2.0.2/lib/restclient/resource.rb:49:in '得到”

因此我從get中刪除了authorized_url參數,然后它開始給我錯誤證書驗證失敗。

所以我把

 :verify_ssl       =>  OpenSSL::SSL::VERIFY_NONE

現在給我錯誤:對等連接重置-SSL_connect

根據Rest-Client gem的文檔

RestClient::Resource.new(
  'https://example.com',
  :ssl_client_cert  =>  OpenSSL::X509::Certificate.new(File.read("cert.pem")),
  :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),
  :ssl_ca_file      =>  "ca_certificate.pem",
  :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
).get

可用於指定ca證書並進行驗證。 如果您不想驗證它,請將verify-ssl密鑰修改為OpenSSL::SSL::VERIFY_NONE

根據RestClient.get()RestClient :: Resource.new(...)。get的RestClient gem源代碼,這兩個方法都調用Request.execute() 因此,您的參數將保持不變,除非您需要將授權的url傳遞給.new的參數。 因此您的代碼將如下所示:

my_client = RestClient::Resource.new(
  authorized_url,
  :ssl_client_cert  =>  OpenSSL::X509::Certificate.new(File.read("cert.pem")),
  :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),
  :ssl_ca_file      =>  "ca_certificate.pem",
  :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
)

my_client.get({ accept: :json }) { |response, request, result, &block|
    raise SparcApiError unless response.code == 200

    @response = response
  }

這樣,您可以重復使用my_client對象來發送具有相同ssl選項和url的GET/POST/PUT/PATCH/DELETE請求。 例如my_client.post(...){...}


注意

  1. 不應在生產中跳過對ssl證書的驗證。 這僅應在開發/測試環境中使用,否則您將很容易受到中間人的攻擊。
  2. 如果您信任CA證書,則應將其添加到主機的已安裝證書捆綁包中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM