PHP SoapClient не получает WSDL с клиентским сертификатом - PullRequest
1 голос
/ 06 марта 2020

Другие подобные вопросы не помогли мне решить эту проблему.

Мне нужно получить файл WSDL, используя комбинацию сертификат клиента + закрытый ключ, с моего веб-сервера, вызывающего другой внешний SOAP API.

$wsdl     = 'https://www.example.com?wsdl';
$endpoint = 'https://www.example.com';

$sslContext = stream_context_create($contextOptions);

$options = [
    'local_cert'                => '/var/www/combo.pem',
    'passphrase'                => 'Pass1',
    'cache_wsdl'                => WSDL_CACHE_MEMORY,
    'trace'                     => 1,
    'stream_context'            => stream_context_create([
        'ssl' => [
            'ciphers'           => 'RC4-SHA',
            'verify_peer'       => false,
            'verify_peer_name'  => false,
            'allow_self_signed' => true
        ]
    ])
];

try{
    $soapClient = new SoapClient($wsdl, $options);
}
catch(Exception $e)
{
    var_dump($e);
}

Я получаю ошибку: SOAP -ERROR: Синтаксический анализ WSDL: Не удалось загрузить из '..domain ..': не удалось загрузить внешнюю сущность "..domain ..? Wsdl "

Я пробовал множество настроек, и ни одна из них не имела никакого значения для этого ответа. Я не пробовал никаких настроек, пустой массив.

Что сработало:

  • Установка необработанного соединения через CURL, поэтому файл сертификата в порядке

  • Получение информации WSDL из SoapUI, поэтому назначение WSDL правильное и файл сертификата в порядке

phpinfo () возвращает SoapClient включен, OpenSSL включен. Что еще я могу попробовать или проверить?

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Я хотел это прокомментировать, но, основываясь на предложениях других пользователей об использовании file_get_contents и вашем ответе, в котором упоминалось, что он вернул false, теперь я уверен, что это скорее проблема с подключением. Пожалуйста, проверьте следующее:

  1. Очевидно, что ваше фактическое значение $wsdl отличается от того, что публикуется, но, пожалуйста, убедитесь, что .com?wsdl не встречается в вашем коде. это должно быть .com/?wsdl.
  2. Проверьте настройки DNS. Поиск в dnslookup может помочь определить проблему.
  3. Убедитесь, что дата и время на сервере установлены правильно. Это может привести к ошибкам SSL.

Если ничего из вышеперечисленного не помогло. Вы можете рассмотреть возможность загрузки содержимого WSDL с помощью других инструментов (например, cURL) и на разных компьютерах, чтобы определить причину проблемы.

1 голос
/ 16 марта 2020

SOAP ошибка может возникать из-за неправильной кодировки символов или, возможно, отсутствует какой-либо HTTP-заголовок, например «User-Agent», при запросе к удаленному серверу.

Попробуйте добавить User-Agent к параметрам, подобным примеру ниже. .

$options = array(
    'http' => array(
        'user_agent' => 'PHP_Embedded_Soap_Client'
    )
);

PS: я бы не рекомендовал строгим шифрам: RC4-SHA

...