[英]Two SoapClient requests for two different thirdparty WSDL services, one works, the other doesn't
在這兩種情況下,各自的WSDL都會在Firefox中加載並顯示“安全連接”。 PHP版本是5.6.22,這意味着默認情況下,PHP將驗證連接是否安全(與PHP 5.5.x和以前的http://php.net/manual/zh/migration56.openssl.php行為相反) )。 這個想法是精確地執行安全連接,兩種情況都是為了確保安全,正確地進行隱式驗證。
需要這種情況下工作(情況A):
$wsdl = 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL';
$entity_loader_status_old = libxml_disable_entity_loader(false);
$SoapClient = new SoapClient($wsdl);
$seed = $SoapClient -> getSeed();
libxml_disable_entity_loader($entity_loader_status_old);
var_dump($seed);
錯誤:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL' : failed to load external entity "https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL"
in /path/to/script.php:3
Stack trace:
#0 /path/to/script.php(3): SoapClient->SoapClient('https://palena....')
#1 {main}
thrown in /path/to/script.php on line 3
此示例案例有效(案例B):
$wsdl = 'https://www.lb.lt/webservices/ExchangeRates/ExchangeRates.asmx?WSDL';
$entity_loader_status_old = libxml_disable_entity_loader(false);
$SoapClient = new SoapClient($wsdl);
$exchangeRate = $SoapClient -> getExchangeRate();
libxml_disable_entity_loader($entity_loader_status_old);
var_dump($exchangeRate);
傾倒:
object(stdClass)#2 (1) { ["getExchangeRateResult"]=> string(2) "-1" }
注意:這種情況是輔助的,僅用於演示。
案例A工作了幾個月(始終為PHP 5.6.x),僅兩天前它停止工作並拋出錯誤,但代碼未更改。 失敗日期接近Web服務證書的有效日期(2016年12月12日至2017年12月14日),看起來服務器剛剛更新了其證書(通過加載WSDL在證書的詳細信息中看到了日期)地址)中,這很可能與問題有關。
顯然,要獲得客戶端的信任,更新的證書需要散布不佳的特定中間證書,因此必須找到中間證書並將其添加到受信任的中間證書包中。 為此,找到了中間證書,並使用其下載地址在客戶端中執行了以下三行:
wget http://symantec.tbs-certificats.com/Symantec_Class_3_EV_SSL_CA_G3.crt
cp Symantec_Class_3_EV_SSL_CA_G3.crt
/etc/pki/ca-trust/source/anchors update-ca-trust
在某種程度上,它似乎起作用了,因為現在不是從第3行( SoapClient
)產生錯誤,而是從第4行( getSeed
)產生錯誤:
Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host
in /path/to/script.php:4
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://palena....', '', 1, 0)
#1 /path/to/script.php(4): SoapClient->__call('getSeed', Array)
#2 /path/to/script.php(4): SoapClient->getSeed()
#3 {main}
thrown in /path/to/script.php on line 4
案例A在禁用安全連接驗證時起作用(但這不是解決方案,因為它破壞了安全性):
$wsdl = 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL';
$entity_loader_status_old = libxml_disable_entity_loader(false);
$SoapClient = new SoapClient(
$wsdl
, [
'stream_context' => stream_context_create([
'ssl' => [
'verify_peer' => false,
],
]),
]
);
$seed = $SoapClient -> getSeed();
libxml_disable_entity_loader($entity_loader_status_old);
var_dump($seed);
傾倒:
string(219) "00436612495400"
為什么案例A無法與安全驗證一起使用,以及如何解決它?
對我而言,案例B也適用:
它重新調整此:
<?xml version="1.0" encoding="UTF-8"?>
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema">
<SII:RESP_BODY>
<SEMILLA>004361002032</SEMILLA></SII:RESP_BODY>
<SII:RESP_HDR><ESTADO>00</ESTADO></SII:RESP_HDR>
</SII:RESPUESTA>
我正在使用PHP 5.5.9版
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.