簡體   English   中英

兩個SoapClient請求兩個不同的第三方WSDL服務,一個起作用,另一個不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM