我使用SOAP与AFAS的Web服务进行通信。由于已知SSL 3.0协议存在一些安全问题,因此他们已停止支持此协议。 他们现在只支持TLS 1.0,TLS 1.1和TLS 1.2。我的PHP SOAP脚本现已崩溃,并且给了我这个错误:
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
更新 我在阅读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,
));
我还要点SSL test,这表示服务器支持TLS 1.0(不支持1.1和1.2)。
答案 0 :(得分:0)
您的错误是php中的默认SOAP客户端不支持对WSDL ITSELF的身份验证。是的,这很差,但你可以下载wsdl并每次从磁盘加载它(不推荐,但这是一个很好的廉价修复)或者看看动态获取wsdl的其他选项,也许使用curl。