2014-11-21 113 views
5

證書我試圖建立與下面的代碼SOAP客戶端:PHP SOAP客戶端通過SSL

<?php 
$wsdl   = 'https://domain.com/?wsdl'; 
$endpoint  = 'https://domain.com'; 
$certificate = dirname(__FILE__) . '/CertWithKey.pem'; 
$password  = 'pwd'; 

$options = array(
    'location'  => $endpoint, 
    'keep_alive' => true, 
    'trace'   => true, 
    'local_cert' => $certificate, 
    'passphrase' => $password, 
    'cache_wsdl' => WSDL_CACHE_NONE 
); 

try { 
    $soapClient = new SoapClient($wsdl, $options); 
} catch(Exception $e) { 
    var_dump($e); 
} 

我被賦予了的.p12密鑰文件具有.crt的認證文件。使用openssl我已將.p12文件轉換爲.pem文件,然後將其與.crt文件合併。 CertWithKey.pem對我來說很好看,兩個證書塊在文件中。

無論我嘗試做什麼,我都會收到一條異常消息SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl"

與遠程方打電話後,他們確認請求已進入,但他們正在記錄此錯誤:ssl handshake interrupted by system [hint: stop button pressed in browser?!]

由於到目前爲止我沒有在網上找到任何有用的信息,我想請你們對此問題有所瞭解。

任何建議可以嘗試什麼?我正在運行PHP 5.3.8,並且服務器的IP地址在遠程方的防火牆中列出了白名單。

回答

4

我修復了這個問題。我認爲,由於關於這個問題和不同解決方案數量的問題數量衆多,其他人將從解決方案中受益。這裏是:

我用openssl CLI程序將.p12密鑰文件轉換爲.pem密鑰文件。訣竅是轉換髮生的方式。

首先,我用這個命令轉換它,我有問題,如問題描述:

openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts

雖然下面的命令做了實際招:

openssl pkcs12 -in key.p12 -out key.pem -clcerts

對於更多信息請查看我使用的來源:https://community.qualys.com/docs/DOC-3273

+0

我也試圖發送SOAP請求到服務器。 我正面臨類似的問題,我無法通過我的PHP應用程序與服務器進行通信。但通過SOAP GUI工作。 我有一個.p12文件,我試圖通過轉換爲.pem文件來使用。 當我創建SOAP客戶端對象,我得到的錯誤: SOAP的錯誤:解析WSDL:// WSDL::無法從https加載未能加載外部實體的https:// WSDL 燦你請告訴我這裏出了什麼問題? – 2015-09-28 07:02:30

+0

如果您已按照我的回答,並且密鑰和crt文件成功合併,則遠程主機可能啓用防火牆並阻止您的IP地址。否則我不能告訴你,也許你應該提出一個問題。 – Ben 2015-09-28 10:56:03

+0

我有同樣的問題。我遵循@Ben提供的確切步驟。 p12必須使用提供的鏈接轉換爲.pem,但我仍然收到錯誤: curl:(58)無法加載客戶端證書-8018 奇怪的是,我想我們的密碼是我提供的是3數字'123',而不得不提供一些有效的6個字母字符的密碼。 所以我相信,應該有一個很好的長度密碼短語(不知道最小長度)。接下來這是缺少的是應該在SoapClient對象初始化中提供的'local_cert','密碼短語'選項。 – 2015-11-03 09:23:35

-1

相同的建議:

  1. 我用SoapClient的使用SSL連接的服務,所有工作正常,沒有指定 「端點」 URL。那麼我建議你嘗試沒有這個選項;

  2. php SoapClient有一個名爲「ssl_method」的選項,您可以在其中更改此協議的某些變體。嘗試更改/指定此參數,如果您知道使用什麼協議;

  3. 在參數列表中指定「verifypeer => false」和「verifyhost => false」;

+0

感謝您的回覆。 '1:'我已經嘗試過了,沒有終點;沒有運氣。 '2:'由於我的PHP版本,我無法使用ssl_method。 '3:'我是錯的還是驗證器和驗證主機未記錄的參數(或者至少它們不在文檔中:http://php.net/manual/en/soapclient.soapclient.php)。提供它們也沒有區別。 – Ben 2014-11-21 14:32:30

+0

'在參數列表中指定「verifypeer => false」和「verifyhost => false;'這意味着禁用安全性。總是一個壞主意 – 2017-08-14 13:02:51