connect: возвращено SSL_connect = 1 errno = 0 состояние = SSLv3 прочитанный сертификат сервера B: сбой проверки сертификата (OpenSSL :: SSL :: SSLError) - PullRequest
13 голосов
/ 01 декабря 2010

Я ужасно переживаю получение 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

      }

Любая помощь приветствуется.

Ответы [ 4 ]

5 голосов
/ 30 марта 2012

проверьте ваш cert.pem и ваш key.pem

ключ сертификата должен иметь один

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

ваш key.pem должен иметь

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

и в нем могут быть некоторые сертификаты, но это не имеет значения для этого случая. (Хотя для меня это так, как curl не работает без дополнительных сертификатов) У веб-службы, с которой я разговариваю, есть хороший корневой ЦС, но ключи аутентификации клиента не являются доверенными, поэтому, вероятно, именно поэтому дополнительные сертификаты заставляют работать 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

curl -v  -E  key.pem  https://services/Service.asmx?wsdl
1 голос
/ 20 февраля 2012

Помещение 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

1 голос
/ 02 декабря 2010

Вам необходимо предоставить файл закрытого ключа, который идет вместе с вашим сертификатом.

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

Если ваш файл закрытого ключа зашифрован, вам также потребуется указать пароль:

http.auth.ssl.cert_key_password = "foobar"
0 голосов
/ 14 декабря 2010

Примечание. Я работал с автоматизацией тестирования в средах более низкого уровня, которые не имели должным образом подписанных сертификатов и часто выдавали ошибки из-за несоответствия сигнатур домена.Для рассматриваемой проблемы обход подписей был правдоподобным решением, но это не решение, которое будет использоваться для разработки уровня производства.

Моя проблема заключается в том, что я пытаюсь проверить самоподписанный сертификат.Все, что мне нужно было сделать, это поместить следующий код и ничего не делать при проверке сертификатов.

Я должен был сделать это для моих вызовов SOAP и REST, которые оба испытывали одну и ту же проблему.* SOAP с использованием Savon

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

      }

REST с использованием HTTPClient

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