我正在尝试在两个LAMP服务器之间进行相互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?!]
我的理解是,这意味着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文件是私钥和证书的串联。
所有服务器都是带有php 5.4.16的Centos7
答案 0 :(得分:2)
我想出了这一个(而且,我是指一个名叫Dino ciuffetti的小伙子)。我遇到了this blog,这让我更了解相互认证,但我仍然无法让事情发挥作用。
我邮寄了博客海报,迪诺,他非常友好地帮助我开展工作。当我尝试使用LetsEncrypt设置第三台服务器时,事情没有按预期工作。
我再一次联系了Dino,他发现证书的目录不允许apache读取访问..一个简单的错误,但我想我已经盯着这个问题太多时间才能看到明显的。
此外,最后将肥皂简化为:
$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>";