2016-12-15 48 views
0

在這兩種情況下,相應的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不具有安全驗證,以及如何解決它的工作?

+0

複製的[與服務器後WSDL服務中斷PHP安全連接更新證書](http://stackoverflow.com/questions/41175867/php-secure-connection-with-wsdl-service-breaks-after-server-renewed-certificate)(回答) – mikl

回答

0

對我來說,情況B也可以工作:

它retuns這樣的:

<?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

+0

是否帶有證書驗證? – mikl

+0

我剛剛運行了你的代碼,它給了我上面的結果: –

+0

我爲每種情況提供了兩個代碼,區別僅僅在於它有明確的證書驗證。現在我嘗試禁用證書驗證並且它工作正常,我認爲你測試了在5.6以前的php中不驗證證書的代碼(http://php.net/manual/en/migration56.openssl.php)。我認爲,如果你嘗試顯式驗證證書的代碼,那麼你會得到錯誤,因爲你有PHP 5.5。 – mikl

相關問題