我正试图在两个LAMP服务器之间获得双向SSL身份验证。使用PHP SOAP进行相互SSL身份验证
我其实有3台服务器。一个是主人,另外两个是客户进行SOAP调用。
在主服务器和一个客户端上,我安装了Comodo Postive SSL证书。我可以从该客户端连接到主服务器并使SSL身份验证成功。
在第二个客户端上,我安装了Lets Encrypt证书。我从他们的网站获得了根证书(并且使用https://whatsmychaincert.com也验证了它是正确的)。
该服务器未通过soap调用。我检查了主httpd的错误日志,它有这样的:
SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]
我的理解是,这意味着客户端不识别该主的证书。
如果我在此客户端上的命令行中使用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是与两个魔岛链和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