我正在尝试发送带有DER证书的SOAP-PHP请求(这意味着证书没有privateKey)但没有成功。
$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'
));
只有我收到这个错误:
警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:无法设置私钥文件`PATHTOMYLOCALCERT'[APP \ Vendor \ WebServices \ MyWS.php,206行]
警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:无法创建SSL句柄[APP \ Vendor \ WebServices \ MyWS.php,第206行]
警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:无法启用加密[APP \ Vendor \ WebServices \ MyWS.php,第206行]
警告(2):SoapClient :: SoapClient(https:// webserviceurl:port / ws / servlet / ws?wsdl)[soapclient.soapclient]:无法打开流:操作失败[APP \ Vendor \ WebServices \ MyWS .php,第206行
警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:I / O警告:无法加载外部实体“https:// webserviceurl:port / ws / servlet / ws?wsdl”[APP \ Vendor \ WebServices \ MyWS.php,第206行]
但是我发现了一个使用函数file_get_contents($ local_cert)的小技巧(在php.net中);错误消失了。
但是一个新的错误来自。
结果:string(773)“读取前缀时出错:Action.Execute”
我的意思是......上面的这个错误......来自WebService?因为它无法通过我的请求进行身份验证?
谢谢大家。 (感谢你的回答)
答案 0 :(得分:7)
我在肥皂电话中使用SSL证书。
在我的情况下,我在我的服务器上为wsdl
和local_cert
提供绝对路径
我已经在课堂上定义了那些。请注意,我使用.pem
格式的证书。
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
)
);
在我的证书中有两部分。证书和RSA私钥。
(1)-----BEGIN CERTIFICATE-----
MIIFjzCC....
....
-----END CERTIFICATE-----
(2)-----BEGIN RSA PRIVATE KEY-----
MIIEpAI....
....
ww==
-----END RSA PRIVATE KEY----
最重要的是,您应该使用https
链接拨打肥皂。这对我来说很好。
希望这会对你有所帮助。