Это решение работает хорошо, но вы должны объявить кодировку в заголовке Curl.

лал несколько скриптов, работающих с внешним 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)

 Adrian Modliszewski09 апр. 2014 г., 12:18
Начиная с PHP 5.5.0 можно установить SSL_METHOD для SoapClient, но если есть проблема при попытке получить файл WSDL, его необходимо загрузить вручную, например, через cURL.

Ответы на вопрос(6)

по протоколу SSL, убедитесь, что вы используете реализацию SSL на основе JSSE.

Войдите в консоль Weblogic и перейдите в раздел Сервер -> (ваш сервер) -> Конфигурация-> SSL-> Дополнительно и проверьтеИспользовать JSSE SSL флажок

Более подробную информацию можно найти вРуководства по Weblogic

класс оболочки где вы можете установить необходимую опцию cURL.

 user57060518 июл. 2013 г., 17:01
Работает сsslv3:// вместоssl://, Благодарю.
 skoTner20 янв. 2011 г., 12:40
Пробовал оба пути, но ни один не работает. Ну, может быть, у меня нет класса оболочки на 100% правильно. Так что, если у вас есть пример для меня, это было бы здорово.

следующая оболочка решила ее (мне пришлось принудительно использовать 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));

если используете кодировку utf-8.
Это решение работает хорошо, но вы должны объявить кодировку в заголовке Curl.

curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')

я думаю, что вы можете сделать

$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
    'ssl_method' => SOAP_SSL_METHOD_SSLv3
));
 edigu08 нояб. 2018 г., 13:45
Не могли бы вы немного рассказать о своем предложении, объяснив преимущества SOAP_SSL_METHOD_SSLv3? Как насчет разницы с SOAP_SSL_METHOD_SSLv23 или отсутствием какого-либо метода вообще?

чтобы создавать оболочку, вы можете попробовать добавить следующие фрагменты кода?

$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);

Удачи!

Ваш ответ на вопрос