2013-08-07 75 views
4

我試圖通過https對C#上編寫的web服務執行soap請求。服務器使用自簽名證書。通過https與自簽名證書通過cURL執行soap請求

在使用SoapClient多次嘗試失敗後,我決定使用純粹的cURL來執行請求。

我的代碼:

<?php 
header('Content-Type: text/plain; charset=utf-8'); 

$url  = 'https://ip:8443/ServiceName'; 
$admin = 'login'; 
$password = 'haShedPassw0rdHere'; 

$post  = 
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     // Soap service params xml 
    </soap:Body> 
</soap:Envelope>'; 

$headers = array(    
    'Content-type: text/xml;charset="utf-8"', 
    'Accept: text/xml', 
    'Cache-Control: no-cache', 
    'Pragma: no-cache', 
    'SOAPAction: https://ip:8443/ServiceName', 
    'Content-length: ' . strlen($post), 
); 

$curl = curl_init(); 

$options = array(
    CURLOPT_URL => $url, 
    CURLOPT_HTTPHEADER => $headers, 
    CURLOPT_HTTPAUTH => CURLAUTH_ANY, 
    CURLOPT_USERPWD => $admin . ':' . $password, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => false, 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => $post, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_HEADER   => false, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_ENCODING  => '', 
    CURLOPT_AUTOREFERER => true, 
    CURLOPT_CONNECTTIMEOUT => 120, 
    CURLOPT_TIMEOUT  => 120, 
    CURLOPT_MAXREDIRS  => 10 
); 

curl_setopt_array($curl, $options); 

var_dump($response = curl_exec($curl)); 
?> 

響應:

string(370) " 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <s:Fault> 
      <faultcode xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
       a:InvalidSecurity 
      </faultcode> 
      <faultstring xml:lang="ru-RU"> 
       Ошибка при проверке безопасности сообщения. 
      </faultstring> 
     </s:Fault> 
    </s:Body> 
</s:Envelope>" 

其中:

Ошибкаприпроверкебезопасностисообщения。

意思是這樣的:

通信安全檢查錯誤。

有什麼我想:

  1. POST request with a self-signed certificate
  2. How to consume a WCF Web Service that uses custom username validation with a PHP page?
  3. Php SoapClient stream_context option
  4. SOAP authentication with PHP
  5. How can I send SOAP XML via Curl and PHP?

其中更多。

問題:我做錯了什麼?

問候。

P.S:測試與PHP 5.3PHP 5.4.14PHP 5.5.1。結果是一樣的。


UPDv1:

C#源代碼,以服務支持團隊提供:

private void Button_SetData_Click(object sender, EventArgs e) 
{ 
    eLeed.WebServiceClient client = 
     new eLeed.WebServiceClient(); 
    client.ClientCredentials.UserName.UserName = "login"; 
    client.ClientCredentials.UserName.Password = "haShedPassw0rdHere"; 
    Stream input = null; 
    input = GetQuery("ServiceMethod", TextBox_Command.Text); 
    XmlDocument response = new XmlDocument(); 
    response.PreserveWhitespace = true; 
    response.Load(client.SetDataContractor(input)); 
    ExeResponse(response); 
    input.Close(); 
    client.Close(); 
} 

那麼,這個按鈕是實際工作。但是如何在cURL中執行類似於php的操作?特別是,如何通過這兩條線:

client.ClientCredentials.UserName.UserName = "login"; 
client.ClientCredentials.UserName.Password = "haShedPassw0rdHere"; 

因此,它不應該像返回「無效憑證」什麼消息?

+0

你能翻譯俄語錯誤信息 – DevZer0

+0

@ DevZer0對不起。剛注意到。 – BlitZ

+0

soap api是否規定了某種形式的安全機制,比如某種形式的標題中的主體哈希?如果您熟悉亞馬遜的'MWS'則需要使用私鑰創建簽名,使用身體的所有有效載荷作爲頭部的一部分傳入 – DevZer0

回答

1

錯誤似乎不是在客戶端,而是在服務器端。服務器說一些安全檢查失敗。如果這是一個客戶端錯誤,您將只能通過cURL得到一個錯誤。你會得到一個XML答案。

你應該看看服務器端。

+0

謝謝。不幸的是,服務器和網絡服務不在我的控制之下。但我期待着聯繫支持。正如他們之前所說,他們「不知道它有什麼問題」。 – BlitZ

+0

從新數據看來,它不是服務器,而是腳本。您不會將必要的信息發送到服務器。它需要一些類似的auf認證。不可能說出驗證如何與提供的信息一起工作。 –

+0

那麼,這是所有支持提供的信息。我也不知道完整的驗證算法。但是,正如他們(和你)提到的那樣,這可能是他們的問題。 – BlitZ

相關問題