Nginx、SSL雙向認證、PHP、SOAP、Webservice、https

來源:互聯網
上載者:User

標籤:

本文是1:1模式,N:1模式請參見新的一篇部落格《SSL雙向認證(高清版)》

----------------------------------------------------- 我是分割線 ---------------------------------------------------------

標題太長了不知道該怎麼起,索性就把keyword列出來吧~

WebService的WS-*搞了一天沒搞定,看樣子PHP應該是徹底拋棄SOAP協議了,google翻爛了也沒找到什麼靠譜的解決方案。

合作方又不願意自己去實現加解密簽名那些東西,沒辦法,只好走https了,把這塊兒從應用程式層拋到更底層去。

但是通訊中的資料安全分幾部分:保密性、不可篡改,不可抵賴

傳統的https調用只是對資料做了加密,解決了保密以及不可篡改問題,解決不了用戶端的身分識別驗證問題,或者叫不可抵賴性。

所以需要使用兩套認證的SSL雙向認證。

目前的Nginx對SSL雙向認證支援的比較好,配置很簡單:

  1. ……  
  2. listen      443;  
  3. server_name test.com;  
  4.   
  5. ssl on;  
  6. ssl_certificate server.crt; //server端公開金鑰  
  7. ssl_certificate_key server.key; //server端私密金鑰  
  8. ssl_client_certificate client.crt; //client端公開金鑰  
  9. ssl_session_timeout 5m;  
  10. ssl_verify_client on; //開啟client驗證  
  11. ……  

其實就是在常規https配置基礎上增加了client端公開金鑰設定,以及開啟client驗證。(更多配置資訊參考nginx官方文檔:http://wiki.nginx.org/HttpSslModule#ssl)

服務端配好了後,原來的wsdl地址就需要通過https才可訪問。但是,用戶端訪問時需要使用client端的認證。

先以curl測試,相關參數:

  1. ……  
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何認證  
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 不檢查認證中網域名稱  
  4. curl_setopt($ch, CURLOPT_VERBOSE, ‘1‘); //開發模式,會把通訊時的資訊顯示出來  
  5. curl_setopt($ch, CURLOPT_SSLCERT, ‘client.crt‘);  //用戶端crt  
  6. curl_setopt($ch, CURLOPT_SSLCERTPASSWD, ‘123456‘);  //用戶端認證密碼  
  7. curl_setopt($ch, CURLOPT_SSLKEY, ‘client.key‘);  //用戶端key  
  8. curl_setopt($ch, CURLOPT_POST, false); //不能用POST  
  9. ……  

我使用的是nusoap實現的webservice服務端(具體參見《你喜歡SOAP嗎?反正我不喜歡!》),此時會看到wsdl中的綁定介面地址已經是443連接埠地址。

下面改用SOAP調用,PHP內建的SoapClient就支援,只需設定如下header:

  1. ……  
  2. cert = "client.pem"; //包含crt和key內容的pem  
  3. $header = array(  
  4.         ‘local_cert‘ => $local_cert, //client認證資訊  
  5.         ‘passphrase‘=> ‘123456‘ //密碼  
  6.         );  
  7. $client = new SoapClient($wsdl, $header);  

需要注意的一點是:此時client.pem的內容需要包含認證以及私密金鑰資訊,如下:

  1. -----BEGIN CERTIFICATE-----  
  2. MIICdTCCAd4C……  
  3. -----END CERTIFICATE-----  
  4.   
  5. -----BEGIN RSA PRIVATE KEY-----  
  6. MIICXQIBAAKB……  
  7. -----END RSA PRIVATE KEY-----  

此時會發現仍然有如下報錯資訊:

  1. SOAP-ERROR: Parsing WSDL: Couldn‘t load from ‘https://test.com/soap_test.php?wsdl‘ : Premature end of data in tag html line 1  

在google上翻到了一個哥們類似的遭遇,結果和我意料的一樣:事先取wsdl的時候soapclient根本沒有使用認證資訊! 用curl抓下來儲存成本地檔案進行調用,一切OK~

Nginx、SSL雙向認證、PHP、SOAP、Webservice、https

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.