2010-09-27 43 views
4

我從提供程序獲取了兩個證書文件,一個格式爲.cer格式,另一個格式爲.p7b格式。然後我將p7b證書轉換爲p12證書。憑藉此證書,我可以從我的瀏覽器連接到wsdl。 然後我開始使用我在本網站上找到的一些說明將該證書轉換爲.pem格式。使用PHP連接到SSL加密的Web服務時遇到問題

cat test.pem key.pem > cert.pem 

我的繼承人爲Web服務類結構:

public function __construct() { 
    $wsdl_url = 'https://url.to/web_service?wsdl'; 
    $pass = 'passphrase'; 
    $cert = 'cert.pem'; 

    try { 
     $this->client = new SoapClient($wsdl_url, array('local_cert' => $cert, 'passphrase' => $pass)); 
    } catch(SoapFault $e) { 
     print_r($e); 
    } 
} 

這裏是錯誤:

openssl pkcs12 -clcerts -nokeys -out test.pem -in mycert.p12 
openssl pkcs12 -nocerts -out key.pem -in mycert.p12 

然後使用以下命令用鑰匙梳理證書

SSL operation failed with code 1. OpenSSL Error messages: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca in /var/www/html/.. 

試圖使用驗證證書:

openssl verify cert.pem 

給了我以下錯誤:

error 20 at 0 depth lookup:unable to get local issuer certificate 

我也嘗試使用下面的OpenSSL命令創建的.pem證書:

openssl pkcs12 -in mycert.p12 -out mycert.pem 

驗證這給了我好,但PHP給了我以下錯誤:

Unable to set local cert chain file `mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer 

我假設它應該有可能以某種方式工作,因爲我可以通過我的瀏覽器使用.p12證書來訪問wsdl。但是我無法找到解決方案,我應該如何繼續。 在此先感謝。

回答

0

我想你在這裏有幾個問題。首先,我不認爲您的SoapClient對象的構造函數正在使用本地證書的選項。選項數組不支持SSL配置選項。其次,鑑於您提供給SoapClient的選項未被使用,Open SSL正在抱怨遠程主機上的證書是自我認證證書。

我認爲應該有可能解決這個問題,但是沒有玩代碼,我不能確定所有的選項。我認爲你需要使用stream_context_create()來創建一個自定義的流上下文來設置你需要的SSL選項(看看http://ca.php.net/stream_context_create和SSL的上下文選項)。然後可以將它作爲config數組中的stream_context選項傳遞給SoapClient對象。使用stream_context你可以設置你需要的各種SSL選項,這些選項將覆蓋默認值。

對不起,我不能更精確地選擇你需要設置的選項。希望在流式上下文中解決您的問題。

0

我在想,它無法找到頒發您隨附的證書的根證書。

證書通常由簽名機構簽署並簽發,您的客戶需要知道簽名機構的公鑰。如果你的證書是一個自簽名證書,那麼它並不重要。

要檢查 openssl x509 -text -noout -in key.pem

檢查輸出,查找發行人。如果發行者與證書的CN不同,那麼您需要來自提供證書的簽名機構的根證書。

您通常可以通過使用瀏覽器打開您的wsdl地址並檢查證書鏈並從層次結構選項卡導出根證書來獲取它。

你把它保存在你的位置的地方我不確定,但是會有些東西指向某種類型的信任存儲。