2012-07-26 10 views
5

Bir DER sertifikası olan bir SOAP - PHP isteği göndermeye çalışıyorum (bu, sertifikanın privateKey içermemesi anlamına geliyor), ancak başarı yok.PHP'de SOAP isteği SSL sertifikası ile nasıl gönderilir?

$local_cert = FULL_PATH_TO_MY_CERT; 

    $client = new SoapClient($wsdl, array(
       'local_cert' => $local_cert, 
       'trace' => 1, 
       'exceptions' => 1, 
       'soap_version' => SOAP_1_1, 
       'encoding' => 'ISO-8859-1', 
       'compression' => (SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP), 
       'location' => 'https://webserviceurl:port/ws/servlet/ws' 
      )); 

Sadece bu hataları alma: Uyarı

(2): SoapClient :: SoapClient() [soapclient.soapclient]: Özel anahtar dosyası `PATHTOMYLOCALCERT ayarlanamıyor'[APP \ Vendor \ WebServisleri'dir \ MyWS.php, hat 206]

Uyarı (2): SoapClient :: SoapClient() [soapclient.soapclient]: bir SSL kolu oluşturmak için başarısız [APP \ satıcı \ WebServisleri'dir \ MyWS.php, satır 206]

Uyarı (2): SoapClient :: SoapClient() [soapclient.soapclient]: Kripto etkinleştirilemedi [APP \ Ven dor \ WebHizmetler \ MyWS.php, satır 206]

Uyarı (2): SoapClient :: SoapClient (https: // webserviceurl: port/ws/servlet/ws? wsdl) [soapclient.soapclient]: açılamadı akış: işlem başarısız [Uygulama \ WebServices \ MyWS.php, satır 206]

Uyarı (2): SoapClient :: SoapClient() [soapclient.soapclient]: G/Ç uyarısı: dış varlık yüklenemedi " https: // webserviceurl: bağlantı noktası/ws/servlet/ws wsdl"[APP \ Vendor \ WebServisleri'dir MyWS.php \, hat 206]

ama kullanarak (php.net cinsinden) küçük bir hile buldum işlev file_get_contents ($ local_cert); hatalar gitti.

Ancak yeni bir hata geliyor.

Sonuç: string (773): ... Yukarıdaki bu hata WebService geliyorsun olduğunu ... "Hata okuma önek Action.Execute"

Demek nedir? çünkü isteğimle kimlik doğrulaması yapılamıyor?

Herkese teşekkürler. (Yanıtlarınız için minnettarız)

+0

burada benzer bir şey: http://stackoverflow.com/questions/11187646/soapclient-not-sending-certificate – BruneX

cevap

7

Sabun çağrımda SSL sertifikası kullanıyorum.

Benim durumumda sunucumun wsdl için mutlak yolunu veriyorum ve local_cert için zaten sınıfımdakileri tanımladım. Sertifikamı .pem biçiminde kullandığımı lütfen unutmayın.

public $local_cert = "/var/www/.../webroot/cert.pem"; 
public $wsdl = "/var/www/.../webroot/my_wsdl.wsdl"; 

$this->client = new SoapClient($this->wsdl, array(
     "trace"   => 1, 
     "exceptions" => true, 
     "local_cert" => $this->local_cert, 
     "uri"   => "urn:xmethods-delayed-quotes", 
     "style"   => SOAP_RPC, 
     "use"   => SOAP_ENCODED, 
     "soap_version" => SOAP_1_2 , 
     "location"  => $this->location 
    ) 
); 

Sertifikamda 2 bölüm var. Sertifika ve RSA Özel Anahtar.

(1)-----BEGIN CERTIFICATE----- 
MIIFjzCC.... 
.... 
-----END CERTIFICATE----- 
(2)-----BEGIN RSA PRIVATE KEY----- 
MIIEpAI.... 
.... 
ww== 
-----END RSA PRIVATE KEY---- 

Ve en önemlisi bir sabun arama yapmak için https bağlantıyı kullanmalıdır. Bu benim için iyi çalışıyor.

Bu yardımcı olur umarım.

+0

** "uri" => "urn: xmethods-delayed-quotes" ** Bu gerçekten gerekli ?? Henüz bağlanamıyorum. – BruneX