【问题标题】:PHP secure connection with WSDL service breaks after server renewed certificate服务器更新证书后 PHP 与 WSDL 服务的安全连接中断
【发布时间】:2017-05-01 17:55:30
【问题描述】:

新证书是“Symantec Class 3 EV SSL CA - G3”。客户端有 CentOS。没有对服务器的控制,它是第三方。在火狐和Chrome中加载WDSL https地址时,两个浏览器都显示“安全连接”,没问题。

WSDL 地址是https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL

测试代码:

$success = false;
$attempts = 0;

while (($success === false) && ($attempts < 10)) {
    $attempts ++;
    echo 'Attempt ' . $attempts . '<br>';

    try {
        $wsdl = 'https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL';
        $entity_loader_status_old = libxml_disable_entity_loader(false);
        $SoapClient = new SoapClient($wsdl);
        $seed = $SoapClient -> getSeed();
        libxml_disable_entity_loader($entity_loader_status_old);
        $success = true;
    } catch (Exception $Exception) {
        echo $Exception -> getMessage() . '<br>';
    }
}

if ($success === true) {
    echo 'SUCCESS';
} else {
    echo 'ERROR';
}

默认连接是安全的,因为 PHP 版本是 5.6.22(高于 5.5.x)。

【问题讨论】:

  • 可能某处缺少证书安装。看起来安全连接失败了。
  • @weirdo 确实安全连接失败,如果我禁用安全性它可以工作。我需要一个安全的连接。如果缺少证书安装,为什么当我在浏览器中加载 WSDL 时浏览器显示“安全连接”?
  • 通常 SOAP 使用 cURL 来建立连接。默认情况下,cURL 使用严格模式,如果安全连接出现问题,则会失败。如果您有权访问服务器,请尝试此 curl https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL 并查看输出
  • 如果您尝试file_get_contents('https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL') 会出现什么错误?
  • @mikl 我的意思是服务器。如果您无法控制它,我希望您至少可以告诉某人修复它。否则你肯定不会是最后一个遇到问题的人......

标签: php security centos wsdl tls1.2


【解决方案1】:

可能重复:OpenSSL: unable to verify the first certificate for Experian URL

要解决问题,请创建一个cafile.pem 并连接所需的赛门铁克证书(主要中间证书和根证书),如上面可能的重复问题链接所示(请参阅 spuder 的答案)。

cafile.pem 引用自 spuder

-----BEGIN CERTIFICATE----- 
(Your Primary SSL certificate: your_domain_name.crt) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
(Your Intermediate certificate: DigiCertCA.crt) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
(Your Root certificate: TrustedRoot.crt) 
-----END CERTIFICATE-----

然后在 PHP 中使用下一个 $options 来创建 SoapClient 对象:

$options = [
    'stream_context' => stream_context_create([
        'ssl' => [
            'cafile' => __DIR__ . '/cafile.pem',
        ],
    ]),
];

$SoapClient = new SoapClient($wsdl, $options);

【讨论】:

  • 捆绑根 CA 证书只会增加开销。
  • 我发布的解决方案是一种解决方法,我真的无法控制服务器配置。我更喜欢一些开销,否则我需要禁用对等验证或根本不使用该服务。如果我无法在服务器端修复它,我还能做什么?
  • 我以为您在谈论服务器并且可能匆忙发表了评论,但可能仍然正确两种方式,因为客户端和服务器都应该已经拥有根。不过,只要它对您有用,客户端的开销并不是什么大问题。我还是会通知网站管理员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多