Выполнение SOAP-вызова в PHP и установка версии SSL
Я создал несколько скриптов, работающих с внешним WSDL. Я столкнулся с тем, что мне нужно интегрировать в нашу систему, и я не могу работать. Я пробовал неделю без каких-либо результатов.
script не удалось создать конструктор уже:
$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL");
Дает ошибку:
PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL' : failed to load external entity "https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL"
У меня есть openssl, установленный и работающий с PHP, и помните, что у меня уже есть другие рабочие SOAP-вызовы для другого WSDL через SSL. Я узнал, что я не могу решить это с помощью сертификата, поскольку он не работает уже в конструкторе.
Но:
Я попытался подключиться к удаленному серверу с командной строкой openssl, и эта команда также потерпела неудачу:
openssl s_client -connect webtjener09.kred.no:443 -state
Но потом я попытался принудительно подключить его к SSL3, и он отлично работал, как это:
openssl s_client -ssl3 -connect webtjener09.kred.no:443 -state
Итак, я подумал, что мне нужно сопоставить SSL-версию удаленного сервера. Чтобы удвоить, я также попытался сделать соединение cURL через PHP, и он провалился, пока я не добавил форсирование версии SSL следующим образом:
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
Добавление CURLOPT_SSLVERSION к соединению cURL сделало это нормально. И тогда корень моего вопроса:
Как заставить PHP-мыльный конструктор/вызов использовать SSL3. Мне кажется, что это должно быть решением. Но я не смог узнать, как настроить функцию PHP SOAP только на использование SSL3. Поскольку как командная строка -openssl-, так и PHP cURL работают с принудительным SSL3, я предполагаю, что то же самое произойдет с моей SOAP-функцией?
Входы, пожалуйста?
(Использование Ubuntu Linux, PHP 5.3.3)
Ответы
Ответ 1
У меня была та же проблема, следующая оболочка решила ее (я должен был заставить SSL2)
class StupidWrapperForOracleServer extends SoapClient {
protected function callCurl($url, $data, $action) {
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", 'SOAPAction: "' . $action . '"'));
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_setopt($handle, CURLOPT_SSLVERSION, 2);
$response = curl_exec($handle);
if (empty($response)) {
throw new SoapFault('CURL error: '.curl_error($handle),curl_errno($handle));
}
curl_close($handle);
return $response;
}
public function __doRequest($request,$location,$action,$version,$one_way = 0) {
return $this->callCurl($location, $request, $action);
}
}
Btw. если это не удается при загрузке части файла WSDL, загрузите WSDL вручную (например, с помощью curl) и используйте этот файл локально. IMHO __doRequest не вызывается на этапе загрузки WSDL.
file_put_contents(dirname(__FILE__) .'/Server.wsdl',get_wsdl()); //get_wsdl uses the same wrapper as above
$oWS = new StupidWrapperForOracleServer(dirname(__FILE__) .'/Server.wsdl',array('trace'=>1,'cache_wsdl'=>0));
Ответ 2
Как и в PHP 5.5.0, я считаю, что вы можете сделать
$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
'ssl_method' => SOAP_SSL_METHOD_SSLv3
));
Ответ 3
Вместо создания оболочки вы можете попробовать добавить следующие фрагменты кода?
$stream_opts = array(
// 'ssl'=>array('ciphers'=>"3DES" // also working
// further ciphers on http://www.openssl.org/docs/apps/ciphers.html
'ssl'=>array('ciphers'=>"SHA1"
)
);
$myStreamContext = stream_context_create($stream_opts);
$soapOptions['stream_context'] = $myStreamContext;
$soapClient = new SoapAuthClient("https://...", $soapOptions);
Удачи!
Ответ 4
Попробуйте 'sslv3://webtjener09....' или используйте класс оболочки, где вы можете установить требуемую опцию cURL.
Ответ 5
Если вы используете Oracle Weblogic 11g для размещения своих веб-сервисов под SSL, убедитесь, что вы используете реализацию SSL на основе JSSE.
Войдите в консоль Weblogic и перейдите на Сервер → (ваш сервер) → Конфигурация- > SSL- > Дополнительно и установите флажок Использовать JSSE SSL.
Более подробную информацию можно найти в Руководствах веб-журнала
Ответ 6
Будьте осторожны, если вы используете кодировку utf-8.
Это решение работает хорошо, но вы должны объявить кодировку в заголовке Curl.
curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')