2015-04-21 5 views
3

ZenLoadBalancer находится перед моими веб-серверами (Debian). Полосы балансировки нагрузки SSL. Это прекрасно работает в браузере. Однако при подключении через SOAP или Curl у меня возникла проблема.не может получить сертификат локального эмитента/SOAP-ERROR: Разбор WSDL: не удалось загрузить с

Я использовал локон тест от другого SO опубликовать, чтобы гарантировать, что проблема была с SSL:

$_h = curl_init(); 
curl_setopt($_h, CURLOPT_HEADER, 1); 
curl_setopt($_h, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($_h, CURLOPT_HTTPGET, 1); 
curl_setopt($_h, CURLOPT_URL, 'https://mydomain.ca/webservice/soap/server.php?wsdl'); 
curl_setopt($_h, CURLOPT_DNS_USE_GLOBAL_CACHE, false); 
curl_setopt($_h, CURLOPT_DNS_CACHE_TIMEOUT, 2); 

//curl_setopt($_h, CURLOPT_SSL_VERIFYPEER, false); 

var_dump(curl_exec($_h)); 
var_dump(curl_getinfo($_h)); 
var_dump(curl_error($_h)); 

Это возвращает:

string(63) "SSL certificate problem: unable to get local issuer certificate" 

Если я раскомментировать CURLOPT_SSL_VERIFYPEER, я получаю XML обратно, как и ожидалось ,

Так вот реальная проблема ... когда я пытаюсь сделать SOAP вызов:

$soap=new SoapClient('https://mydomain.ca/webservice/soap/server.php?wsdl'); 

Это возвращает:

PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://mydomain.ca/webservice/soap/server.php?wsdl' : failed to load external entity "https://mydomain.ca/webservice/soap/server.php?wsdl" 

Если я беру балансировки нагрузки из уравнения (и настроить ssl virtualhosts и т. д.), мыльная служба работает нормально. Единственное, когда я добавляю в балансировщик нагрузки, что получаю эту проблему.

У меня создается впечатление, что проблема в том, что проблема в том, что говорит от Curl. «Не удалось получить сертификат локального эмитента». Однако я попытался установить ca-сертификаты, указав файлы PEM и т. Д. И т. Д. но ничего не работает.

На веб-сервере, я могу:

openssl s_client -connect mydomain.ca:443 

Это действительно возвращает сертификат.

Я подтвердил, что сервер прослушивает порты 443/8080/80 .. так что это должно быть хорошо (отключено iptables на всякий случай). Я проверил ports.conf, и все это слушает с этой целью.

Надеюсь, что кто-то из вас может помочь мне указать меня в другом направлении. B/c. Я не совсем уверен, что искать в bing/google на этом этапе. Любая помощь будет оценена по достоинству.

Спасибо.

ответ

2

Наконец-то понял это. Они ключ к знанию, это, наконец, исправил, запустив:

# openssl verify domain.pem 

, который должен ответить:

domain.pem: OK 

До этого был зафиксирован, ответ был:

unable to get local issuer certificate 

Теперь, исправить ... ну, проблема ... это было потому, что когда я создал файл PEM, я использовал неправильный промежуточный сертификат. Как ни странно, браузеру (IE/Chrome/FF) не было никаких проблем с этим. Только при использовании Curl/SOAP я получил ошибку.

Чтобы исправить это в моем случае, я получил надлежащий промежуточный сертификат от своего поставщика ssl (найденный на их странице поддержки), перестроил мой файл PEM с их промежуточным сертификатом, протестировал pem с помощью «openssl verify» и получил ожидаемый ответ ... «ОК». После этого я переконфигурировал балансировщик нагрузки, чтобы использовать этот новый файл PEM, и он сработал. SOAP смог подключиться!

В любом случае, надеюсь, что это может помочь кому-то в будущем, чтобы они не сжигали 6 часов, как я сделал.

Смежные вопросы