如何在 PHP 中加密每个 SOAP 请求

11

我无法在PHP中进行加密的SOAP请求。根据文档,我对每个支付网关请求进行了加密。我生成了CSR并将其发送给证书授权机构。他们发送回来了域证书和CA证书。最大的问题是文档不适用于PHP。根据文档:

Web服务受到WS-Security签名和加密策略的保护

经过长时间的搜索,我从Git上找到了一个辅助类,但每当我尝试连接时,会收到以下错误:

一般安全错误(找不到用于解密的证书(KeyId))

FaultCode : wsse:InvalidSecurity

我尝试设置SSL头如下:

$contextOptions = array(
    'ssl' => array(
        'verify_peer'   => false,
        'verify_peer_name'  => false,
        'cafile'        => '../../certs/CA.cer',
        'local_cert'        => '../../certs/server.cer',
        'local_pk'        => '../../certs/private_key.key',
        'verify_depth'  => 0,
        'allow_self_signed'=>true,
    )
);

$sslContext = stream_context_create($contextOptions);

更新

我把键定义为:

define('PRIVATE_KEY', 'server_prvate_key.key');
define('CERT_FILE', 'domain_cert.cer');
define('SERVICE_CERT', 'CA.cer');

这个定义有什么问题吗(请参见上面的GIT链接)?


你需要定义密钥和证书的完整路径,那个辅助类无法猜测它们在哪个文件夹中。 - Capsule
@Capsule 路径正确,密钥和证书内容也可用。 - Shan
你要把这个类实现在哪里? - therebelcoder
@stevenvanc 我按照链接中的示例完全使用了该类。如果有其他方法,我真的不需要使用该类,但是我对SOAP的知识不是很好。 - Shan
我是这么说的:能展示更多的代码吗?我没有看到在你的代码中调用或实现那个类。 - therebelcoder
显示剩余3条评论
1个回答

6

您是否厌倦了使用curl?

使用以下选项来设置您的证书:

    curl_setopt($ch,CURLOPT_CAINFO, 'CA.cer' );
    curl_setopt($ch,CURLOPT_SSLCERT, 'domain_cert.cer' );
    curl_setopt($ch,CURLOPT_SSLKEY, 'server_prvate_key.key' );
    curl_setopt($ch,CURLOPT_SSLCERTPASSWD, 'certificate_password' ); //if have

我使用curl建立加密连接到支付网关和其他服务,效果非常好。


我尝试了curl,但在执行curl后得到了false。检查异常后,我发现错误是:“wsse:InvalidSecurityMissing wsse:Security header in request”,我不知道如何添加安全头!搜索了一段时间后,我找到了一些带有用户名和密码的示例。 - Shan

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