簡體   English   中英

connect:SSL_connect返回= 1 errno = 0 state = SSLv3讀取服務器證書B:證書驗證失敗(OpenSSL :: SSL :: SSLError)

[英]connect: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

我很難獲得SSL來驗證證書。 我完全不了解證書是如何運作的,所以這是一個重大的障礙。 這是運行腳本時出現的錯誤:

c:/Ruby191/lib/ruby/1.9.1/net/http.rb:611:in `connect': SSL_connect returned=1 e
rrno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL
::SSL::SSLError)

這是相關的代碼:

client = Savon::Client.new order_svc

request = client.create_empty_cart { |soap, http|
  http.auth.ssl.cert_file = 'mycert.crt'
  http.auth.ssl.verify_mode = :none
  http.read_timeout = 90
  http.open_timeout = 90
  http.headers = { "Content-Length" => "0", "Connection" => "Keep-Alive" }
  soap.namespaces["xmlns:open"] = "http://schemas.datacontract.org/2004/07/Namespace"
  soap.body = {
      "wsdl:brand" => brand,
      "wsdl:parnter" => [
        {"open:catalogName" => catalogName, "open:partnerId" => partnerId }
      ] }.to_soap_xml

      }

任何幫助表示贊賞。

檢查你的cert.pem和你的key.pem

cert密鑰應該有一個

-----BEGIN CERTIFICATE-----
MIIFGDCCBACgAwIBAgIKG1DIagAAAAAAAzANBgkqhkiG9w0BAQsFADCBvDEkMCIG
....
-----END CERTIFICATE-----

你的key.pem應該有

-----BEGIN PRIVATE KEY-----
CSqGSIb3DQEJARYVY2Fjb250YWN0QGVzY3JlZW4uY29tMQswCQYDVQQGEwJVUzEP
....
-----END PRIVATE KEY-----

它可能有一些證書,但對於這種情況無關緊要。 (雖然它對我而言,因為curl在沒有額外證書的情況下不起作用)我正在談論的web服務具有良好的根CA,但客戶端auth密鑰不受信任,因此這可能是額外的證書使curl工作的原因。

從客戶證書中獲取這些是導致我出現問題的原因。

這對我有用。

openssl pkcs12 -in Client.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in Client.pfx -nodes -out key.pem

每個都會提示您輸入導入密碼,如果需要,您可以設置pem密碼。 (你必須稍后在ruby代碼中設置它)

require 'savon'
client = Savon::Client.new "https://service/Service.asmx?wsdl"
client.http.auth.ssl.cert_key_file = "key.pem"
client.http.auth.ssl.cert_file = "cert.pem"
client.http.auth.ssl.verify_mode=:peer

p client.wsdl.soap_actions

你也可以用卷曲測試

curl -v  -E  key.pem  https://services/Service.asmx?wsdl

您需要提供隨證書一起提供的私鑰文件。

http.auth.ssl.cert_key_file = "mycert.pem"

如果您的私鑰文件已加密,您還需要提供密碼:

http.auth.ssl.cert_key_password = "foobar"

http.auth.ssl.verify_mode = :none放在client.request塊中對我來說不起作用。

我不得不使用:

client = Savon::Client.new do |wsdl, http|
  http.auth.ssl.verify_mode = :none
  wsdl.document = #YOUR_WSDL_URL_HERE
end

使用Savon 0.9.9和Ruby 1.9.3-p125

注意:我在較低級別的環境中使用測試自動化,這些環境沒有正確簽名的證書,並且由於域簽名不匹配而經常會拋出錯誤。 對於手頭的問題,繞過簽名是一個合理的解決方案,但它不是用於生產級別開發的解決方案。

我的問題是我正在嘗試驗證自簽名證書。 我所要做的就是放下以下代碼,省略與驗證證書有關的任何事情。

我必須為我遇到同樣問題的SOAP和REST調用執行此操作。

使用Savon的SOAP

client = Savon::Client.new order_svc

request = client.create_empty_cart { |soap, http|
  http.auth.ssl.verify_mode = :none
  http.headers = { "Content-Length" => "0", "Connection" => "Keep-Alive" }
  soap.namespaces["xmlns:open"] = "http://schemas.datacontract.org/2004/07/Namespace"
  soap.body = {
      "wsdl:brand" => brand,
      "wsdl:parnter" => [
        {"open:catalogName" => catalogName, "open:partnerId" => partnerId }
      ] }.to_soap_xml

      }

使用HTTPClient的REST

client = HTTPClient.new
client.ssl_config.verify_mode=(OpenSSL::SSL::VERIFY_NONE)
resp = client.get(Methods)

暫無
暫無

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

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