php - 使用 PHP SOAP 的相互 SSL 身份验证

标签 php ssl soap mutual-authentication

我正在尝试让两个 LAMP 服务器之间的相互 ssl 身份验证工作。

我实际上有 3 个服务器。一个是主服务器,另外两个是对其进行 SOAP 调用的客户端。

在主机和一个客户端上,我安装了 Comodo Postive SSL 证书。我可以从该客户端连接到主服务器并使 SSL 身份验证成功。

在第二个客户端上,我安装了 Lets Encrypt 证书。我从他们的网站上获得了根证书(并使用 https://whatsmychaincert.com 验证了它是正确的)。

此服务器无法调用 soap。我检查了 master 上的 httpd 错误日志,它有这个:

SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]

我的理解是,这意味着 CLIENT 没有验证 MASTER 的证书。

如果我在该客户端上的命令行中使用 cURL,那确实有效。我这样调用 cURL:

curl  -v --cert /etc/letsencrypt/live/ssl3.demoserver.co.za/cert.pem
  --cacert /etc/letsencrypt/live/ssl3.demoserver.co.za/combined.crt 
  --key /etc/letsencrypt/live/ssl3.demoserver.co.za/privkey.pem
      https://ssl2.demoserver.co.za/index.php

在这种情况下,combined.crt 是一个包含 comodo 链和 letsencrypt 链的文件。

PHP 文件如下所示:

<?php

$contextOptions = array(
'ssl' => array(
    'verify_peer'   => true,
    'cafile'        => '/etc/letsencrypt/live/ssl3.demoserver.co.za/combined.crt',
    'local_cert'        => '/etc/letsencrypt/live/ssl3.demoserver.co.za/keycert.pem',
    'verify_depth'  => 5,
    'disable_compression' => true,
    'SNI_enabled'         => true
)
);

$sslContext = stream_context_create($contextOptions);

$options2 = array(
    'uri' => 'https://ssl2.demoserver.co.za',
            'location' => 'https://ssl2.demoserver.co.za/Soap.php',
            'trace' => 1,
            'stream_context' => $sslContext
    );

$client = new SoapClient(NULL, $options2);
print "<span style=\"color:green;\">'".$client->GetData()."'<span>";

?>

keycert.pem 文件是私钥和证书的串联。

所有服务器都是Centos7 php 5.4.16

最佳答案

我想出了这个(我指的是一个名叫 Dino ciuffetti 的家伙)。我遇到了this blog这帮助我对相互身份验证有了更多的了解,但我仍然无法正常工作。

我给博主 Dino 发了邮件,他很友善地帮助我解决问题。当我尝试自行设置带有 LetsEncrypt 的第三台服务器时,事情没有按预期工作。

我再次联系了 Dino,他发现证书的目录不允许 apache 读取访问权限。这是一个简单的错误,但我想我已经盯着这个问题看了太多小时,以至于看不出明显的东西。

此外,最后 SOAP 被简化为:

$options2 = array(
    'uri' => 'https://ssl2.demoserver.co.za',
            'location' => 'https://ssl2.demoserver.co.za/Soap.php',
            'trace' => 1,
            'local_cert' => '/etc/letsencrypt/live/ssl3.demoserver.co.za/keycert.pem'
    );

$client = new SoapClient(NULL, $options2);
print "<span style=\"color:green;\">'".$client->GetData()."'<span>";

关于php - 使用 PHP SOAP 的相互 SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45527362/

相关文章:

java - 如何验证基于 soap 的 Java Web 服务?

php - 在我的 Android 应用程序中获取 localhost 上的 MySQL 的 'easiest' 方法

php - 有没有办法检测字符串在 PHP 或 symfony 中是否具有有效的 HTML 语法?

android - Android 4.4 上的 SSL 证书问题 : Trust anchor for certification path not found

android - 如何使用 SOAP 将数据发布到服务器

web-services - Perl - SOAP::WSDL - wsdl2perl.pl

php - MySQL 通过截断小时、分钟和秒来按时间戳进行过滤

php - 如何在单个查询 Zend Framework 中从相关表返回行

ssl - 只能使用一个文件中的中间证书和根证书来验证证书

php - chrome 重定向到安全 Assets