Я сделал несколько скриптов, работающих с внешним WSDL. Я столкнулся с тем, что мне нужно интегрировать в нашу систему, и я не могу работать. Я пробовал неделю без каких-либо результатов.
Сценарий не работает при создании конструктора:
$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)
У меня была та же проблема, следующая оболочка решила ее (мне пришлось принудительно использовать 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));
Начиная с PHP 5.5.0, я считаю, что вы можете сделать
$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array( 'ssl_method' => SOAP_SSL_METHOD_SSLv3 ));
Вместо создания обертки вы можете попробовать добавить следующие фрагменты кода?
$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);
Удачи!
Попробуйте 'sslv3: // webtjener09 ….' или используйте класс-оболочку, где вы можете установить требуемую опцию cURL.
Если вы используете Oracle Weblogic 11g для размещения своих веб-сервисов под SSL, убедитесь, что используете JSSE-based SSL-реализацию.
Войдите в консоль Weblogic и перейдите на Сервер -> (ваш сервер) -> Конфигурация-> SSL-> Дополнительно и установите флажок Использовать JSSE SSL .
Более подробную информацию можно найти в руководствах по Weblogic
Будьте осторожны, если вы используете кодировку utf-8.
Это решение работает хорошо, но вы должны объявить кодировку в заголовке Curl.
curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')