Невозможно подключить клиент SOAP (savon) к веб-службам SOAP через HTTPS
Прежде чем пытаться решить эту проблему, я понятия не имел, как работают сертификаты или SSL, поэтому, пожалуйста, миритесь с моим n00b-ness.
В настоящее время я использую гем Savon (v. 0.9.9), чтобы попытаться подключиться к веб-сервису на основе SOAP через HTTPS. Однако мне трудно делать успешные звонки.
Как я понимаю протокол SSL/TSL, клиент отправляет начальное сообщение "hello client" на сервер, на который сервер отвечает "hello server", который включает цифровой сертификат сервера. Клиент проверит цепочку этого сертификата по локальному пакету Cert Authority, чтобы узнать, можно ли доверять этому сертификату. Как говорится, вот что я попробовал.
Обновление сертификатов CA RVM. Сначала я получал ту же ошибку, описанную в этом потоке SO, и узнал, что Ruby проверяет сертификаты CA. Я также нашел эти инструкции по обновлению сертификатов CA, которые использует RVM. Поэтому я запустил в iTerm следующее:
rvm osx-ssl-certs status all
и я получил следующий вывод:
Certificates for /Users/user-name/.rvm/usr/ssl/cert.pem: Up to date.
Тем не менее, это не позволило мне успешно выполнять вызовы SOAP через HTTP.
Проверьте правильность SSL-сертификата удаленного сервера: отсюда я узнал об инструменте CI openssl и решил, что проблема не во мне. Возможно, проблема в самом сертификате. Поэтому я запустил следующую команду в iTerm:
openssl s_client -connect [HOST]:[PORT] -showcerts
В дополнение к самому сертификату я получил следующее:
Verify return code: 18 (self signed certificate)
Насколько я понимаю, поскольку этот сертификат самоподписан, то, если он сам не был доверенным центром сертификации, он, конечно, никогда не сможет быть проверен. Таким образом, проблема не с сертификатом, проблема с моим локальным центром сертификации.
Обновление пакета локального CA. Насколько я понимаю, cert.pem представляет собой список доверенных сертификатов CA. На самом деле я нашел два таких файла на моей локальной машине:
/Users/user-name/.rvm/usr/ssl/cert.pem
а также
/System/Library/OpenSSL/cert.pem
Я не был уверен, какой из них мне следует обновить, поэтому я скопировал один из этих файлов в каталог моего приложения, скопировал и вставил сертификат в новый локальный cert.pem и попытался снова. К сожалению, теперь я получаю следующее:
OpenSSL::SSL::SSLError: hostname does not match the server certificate
На данный момент я не совсем уверен, что делать, так как, насколько я могу судить, сертификат теперь должен рассматриваться как доверенный сертификат. Вот мой код на данный момент:
$SOAP_CORE = Savon::Client.new do |wsdl, http|
http.auth.ssl.ca_cert_file = path_to_local_cert.pm
http.auth.ssl.verify_mode = :peer
wsdl.document = path_to_remote_wsdl_over_https
end
1 ответ
Насколько я понимаю, поскольку этот сертификат самоподписан, то, если он сам не был доверенным центром сертификации, он, конечно, никогда не сможет быть проверен. Таким образом, проблема не с сертификатом, проблема с моим локальным центром сертификации.
Я запутался, как вы пришли к такому выводу. Самозаверяющий сертификат проверять не будет, поэтому проблема связана с сертификатом. Обновление вашего CA-пакета не поможет, если самоподписчик не окажется там, что кажется глупым.
Попробуйте отключить проверку.
http.auth.ssl.verify_mode = :none