PHP SoapClient警告:SoapClient :: SoapClient():无法设置私钥文件

时间:2010-01-21 15:34:53

标签: php soap key private

我正在尝试使用soap调用web服务,但我不断收到以下错误“警告:SoapClient :: SoapClient():无法设置私钥文件”。

我假设错误是由于我使用的.cer文件只包含公钥而没有私钥。但我不确定使用.cer文件的另一种方法。如果我不使用.cer文件,我可以很好地连接,当我使用__getFunctions()方法时,我能够调用和接收结果。但是,当我尝试使用其他方法时,我需要获得授权,这会导致问题。下面是我想要使用的简单代码。如果需要更多信息,请告诉我。

ini_set('display_errors',1);
error_reporting(E_ALL);

ini_set('soap.wsdl_cache_enabled', 0);
$username = 'user';
$password = 'pass';

$ns = 'GatewayEDI.WebServices';
$auth = array();
$auth['User'] = new SOAPVar($username, XSD_STRING, null, null, null, $ns);
$auth['Password'] = new SOAPVar($password, XSD_STRING, null, null, null, $ns);
$headerBody = new SOAPVar($auth, SOAP_ENC_OBJECT);
$header = new SOAPHeader($ns, 'AuthSOAPHeader', $headerBody);

$client=new SoapClient('https://url/Service.asmx?WSDL',
                   array(
                  'local_cert' => 'file.cer'
                   ));

$client->__setSOAPHeaders(array($header));

$param = array(
  'X12Input'=>"testing",
  "GediPayerID"=>"52",
  "ResponseDataType"=>"Xml"
);

//this leads to private key error
echo $result = $client->DoInquiryByX12Data($param,$header);

1 个答案:

答案 0 :(得分:2)

我相信您的.pem / .cer文件中应包含您的私钥:

-----BEGIN RSA PRIVATE KEY----- 
# base64 encoded key 
-----END RSA PRIVATE KEY----- 
-----BEGIN CERTIFICATE----- 
# base64 encoded cert
-----END CERTIFICATE-----

如果您的私钥的第一行有类似于“Proc-Type:4,ENCRYPTED”的指令,那么在构建SoapClient()时,您需要包含“密码”选项。您还可以使用OpenSSL去除密码短语要求,我的语法有点生疏,因此您可能需要仔细检查是否尝试过:

openssl rsa -in /path/to/private.key -out /path/to/private.key

“private.key”应该只是此上下文中的私钥(您可以在删除密码后将其添加到.cer / .pem文件中。