如何在PHP中使用SSL证书发送SOAP请求?

6

我正在尝试使用 DER 证书(即证书没有私钥)发送带有 SOAP - PHP 请求,但一直未成功。

$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,line 206]

警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:未能创建SSL句柄[APP \ Vendor \ WebServices \ MyWS.php,line 206]

警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:未能启用加密[APP \ Vendor \ WebServices \ MyWS.php,line 206]

警告(2):SoapClient :: SoapClient(https://webserviceurl:port/ws/servlet/ws?wsdl)[soapclient.soapclient]:无法打开流:操作失败[APP \ Vendor \ WebServices \ MyWS.php,line 206]

警告(2):SoapClient :: SoapClient()[soapclient.soapclient]:I / O警告:无法加载外部实体“https://webserviceurl:port/ws/servlet/ws?wsdl”[APP \ Vendor \ WebServices \ MyWS.php,line 206]

但我在php.net上发现了一个小技巧,使用函数file_get_contents($local_cert); 错误消失了。

但是,新的错误出现了。

结果:字符串(773)“读取前缀错误:Action.Execute”

我的意思是...上面的错误...是否来自Web服务? 因为它无法验证我的请求?

谢谢大家。 (感激你们的回答)


SOAPClient没有发送证书。 - BruneX
1个回答

7

我在我的SOAP调用中使用SSL证书。

在我的情况下,我为wsdllocal_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 链接来进行 SOAP 调用。这对我来说很有效。

希望这能帮助到您。


"uri" => "urn:xmethods-delayed-quotes" 这真的有必要吗?我还不能连接。 - BruneX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接