在這兩種情況下,相應的WSDL在Firefox中加載並顯示「安全連接」。 PHP版本是5.6.22,這意味着默認情況下PHP會驗證連接是否安全(與PHP 5.5.x和之前的版本http://php.net/manual/en/migration56.openssl.php的行爲相反)。這個想法是精確地執行安全連接,兩種情況都是安全的,正確的驗證是隱含的。兩個SoapClient請求兩個不同的第三方WSDL服務,一個工作,另一個不工作
需要這種情況下工作(案例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),僅前兩天就停止工作,並引發錯誤,但沒有代碼已被更改。失敗的日期接近於Valid-From 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作品禁用安全連接驗證時(但是這不是解決辦法,因爲過b reaks安全):
$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不具有安全驗證,以及如何解決它的工作?
複製的[與服務器後WSDL服務中斷PHP安全連接更新證書](http://stackoverflow.com/questions/41175867/php-secure-connection-with-wsdl-service-breaks-after-server-renewed-certificate)(回答) – mikl