Я пытаюсь получить взаимную аутентификацию ssl, работающую между двумя серверами LAMP.
У меня на самом деле 3 сервера. Один из них является ведущим, а два других — клиентами, выполняющими SOAP-вызовы.
На главном и одном клиенте у меня установлены сертификаты Comodo Postive SSL. Я могу подключиться от этого клиента к мастеру и успешно пройти аутентификацию SSL.
На втором клиенте я установил сертификат Lets Encrypt. Я получил корневой сертификат от их веб-сайта (и также подтвердил, что он был правильным, используя https://whatsmychaincert.com).
Этот сервер не может выполнить мыльный вызов. Я проверил журнал ошибок httpd на главном компьютере, и он имеет это:
SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]
Насколько я понимаю, это означает, что КЛИЕНТ не проверяет сертификат МАСТЕРА.
Если я использую 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
В этом случае комбинированный .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
Я понял это (и под словом я имею в виду парня по имени Дино Чуффетти). Я наткнулся этот блог что помогло мне понять взаимную аутентификацию немного больше, но я все еще не мог заставить все работать.
Я отправил по почте постера в блоге, Дино, и он был достаточно любезен, чтобы помочь мне заставить вещи работать. Когда я попытался настроить третий сервер с LetsEncrypt на нем, все не работало, как ожидалось.
Я снова обратился к Дино, и он обнаружил, что каталог сертификата не разрешает доступ для чтения 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>";
Других решений пока нет …