Connect: SSL_connect return = 1 errno = 0 state = SSLv3 считать сертификат сервера B: проверка сертификата не выполнена (OpenSSL:: SSL:: SSLError)
У меня ужасное время, когда SSL проверяет сертификат. Я совершенно не осведомлен о том, как работают сертификаты, с тем чтобы начать основной гандикап. Вот ошибка, которую я получаю при запуске script:
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
}
Любая помощь приветствуется.
Ответы
Ответ 1
Примечание. Я работал с автоматизацией тестирования в средах более низкого уровня которые не имели должным образом подписанных сертификатов и часто бросали ошибки из-за несоответствия доменных подписей. Для в обход подписей было правдоподобным решением, но это не решение, которое будет использоваться для развития уровня производства.
Моя проблема в том, что я пытаюсь проверить самозаверяющий сертификат. Все, что мне нужно было сделать, это поместить следующий код и опустить что-либо, что связано с проверкой сертификатов.
Я должен был сделать это для обоих вызовов 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)
Ответ 2
проверьте свой cert.pem и ваш key.pem
ключ сертификата должен иметь один
-----BEGIN CERTIFICATE-----
MIIFGDCCBACgAwIBAgIKG1DIagAAAAAAAzANBgkqhkiG9w0BAQsFADCBvDEkMCIG
....
-----END CERTIFICATE-----
ваш ключ .pem должен иметь
-----BEGIN PRIVATE KEY-----
CSqGSIb3DQEJARYVY2Fjb250YWN0QGVzY3JlZW4uY29tMQswCQYDVQQGEwJVUzEP
....
-----END PRIVATE KEY-----
и в нем могут быть какие-то сертификаты, но это не имеет значения для этого случая. (Хотя это делает для меня, поскольку завиток не работает без дополнительных сертификатов)
У вебсервиса, с которым я разговариваю, есть хороший корневой ЦС, но ключи авторизации клиента не доверяются, поэтому, вероятно, поэтому дополнительные сертификаты делают работу с завихрением.
получение этих данных из вашего сертификата клиента вызвало у меня проблемы.
вот что сработало для меня.
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
Ответ 3
Вам необходимо предоставить файл секретного ключа, который будет сопровождаться вашим сертификатом.
http.auth.ssl.cert_key_file = "mycert.pem"
Если ваш файл секретного ключа зашифрован, вам также необходимо указать пароль:
http.auth.ssl.cert_key_password = "foobar"
Ответ 4
Ввод 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