我正試圖在兩個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