2014-10-24 2 views
2

Я использую SOAP для связи с веб-сервисом AFAS. Поскольку известно, что протокол SSL 3.0 имеет некоторые проблемы с безопасностью, они перестали поддерживать этот протокол. Теперь они поддерживают только TLS 1.0, TLS 1.1 и TLS 1.2. Мой PHP SOAP скрипт теперь разбился, и дает мне эту ошибку:SOAP-связь через TLS вместо SSL3.0

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://profitweb.afasonline.nl/profitservices/updateconnector.asmx?wsdl' : failed to load external entity "https://profitweb.afasonline.nl/profitservices/updateconnector.asmx?wsdl"

На данный момент я не знаю, где я должен решить эту проблему. Как я могу общаться по другому протоколу? Нужно ли мне что-то менять в PHP-коде или это проблема с сервером?

Ниже кода PHP я использую, далее вниз какая-то информация о сервере:

$wsdl = "https://profitweb.afasonline.nl/profitservices/updateconnector.asmx?wsdl"; 

$client = new SoapClientAuth($wsdl, 
    array(
     'login' => $login, 
     'password' => $password 
    )); 

SoapClientAuth класс: информация

class SoapClientAuth extends SoapClient{ 
    public $Username = NULL; 
    public $Password = NULL; 

    /** 
    * 
    * @param string $wsdl 
    * @param array $options 
    */ 
    function SoapClientAuth($wsdl, $options = NULL) 
    { 
    stream_wrapper_unregister('https'); 
    stream_wrapper_unregister('http'); 
    stream_wrapper_register('https', 'streamWrapperHttpAuth'); 
    stream_wrapper_register('http', 'streamWrapperHttpAuth'); 

    if($options) 
    { 
     $this->Username = $options['login']; 
     streamWrapperHttpAuth::$Username = $this->Username; 
     $this->Password = $options['password']; 
     streamWrapperHttpAuth::$Password = $this->Password; 
    } 

    #parent::SoapClient($wsdl, ($options?$options:array())); 
    parent::SoapClient($wsdl, $options); 

    stream_wrapper_restore('https'); 
    stream_wrapper_restore('http'); 
    } 

Сервера:

Registered PHP Streams: https, ftps, compress.zlib, php, file, glob, data, http, ftp, phar, zip 
Registered Stream Socket Transports: tcp, udp, unix, udg, ssl, sslv3, sslv2, tls 
SSL Version: OpenSSL/1.0.0 

UPDATE Я обновил свою первую часть o F код после прочтения this article, тоже не Сукчес :(:

$opts = array(
    'ssl' => array(
    'verify_peer' => true, 
    'cafile'  => '/etc/ssl/certs/cacert.pem', 
    'verify_depth' => 5, 
    'CN_match'  => 'profitweb.afasonline.nl', 
    'disable_compression' => true, 
    'SNI_enabled'   => true, 
    'ciphers'    => 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK' 
) 
); 

$context = stream_context_create($opts); 

$client = new SoapClientAuth($wsdl, 
    array(
    'login' => $login, 
    'password' => $password, 
    'stream_context' => $context, 
)); 

Я также DIT SSL test и это TELS мии, что TLS 1.0 поддерживается сервером (1.1 и 1.2 нет).

ответ

0

Ваша ошибка в том, что клиент SOAP по умолчанию в php не поддерживает аутентификацию для WSDL ITSELF. Да, это плохо, но вы можете либо загружать wsdl, либо загружать его с диска каждый раз (не рекомендуется, но это дешевое исправление), либо просматривать другие варианты загрузки wsdl динамически, возможно, используя завиток.

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