Все статьи
Битрикс 19 января 2024 1 мин чтения

Битрикс. Битва с сокетами

Одной из самых распространенных проблем при проверке системы является ошибка в работе сокетов. В скрипте проверки системы, на этапе тестирования работы сокетов, происходит запрос сервера к самому себе через стандартную PHP функцию fsockopen(). Результат выполнения теста можно увидеть в логах проверки системы.Обычно это ошибка вида: Воспроизвести проверку можно и вручную, выполнив следующий код в командной […]

Одной из самых распространенных проблем при проверке системы является ошибка в работе сокетов.

В скрипте проверки системы, на этапе тестирования работы сокетов, происходит запрос сервера к самому себе через стандартную PHP функцию fsockopen(). Результат выполнения теста можно увидеть в логах проверки системы.
Обычно это ошибка вида:

Воспроизвести проверку можно и вручную, выполнив следующий код в командной строке:

ini_set("display_errors", true);
error_reporting(6135);
$a = fsockopen ("ssl://bitrix-site.ru", 443, $b, $c, 5);
echo $a, $b, $c;

Возвращается ошибка:

fsockopen(): Unable to connect to ssl://bitrix-site.ru:443 (Connection timed out).

Это говорит о том, что с портала нет подключения к себе же по ssl (при этом портал открывается по HTTPS).

Пытаемся пинговать сайт с удаленного устройства — всё ок, пакеты идут. При попытке выполнить команду ping с localhost, ping уходит в таймаут. Очевидно проблема в файле hosts.

Открываем hosts на редактирование командой:

nano /etc/hosts

В нашем случае сервер находится в частной сети, поэтому сопоставляем доменное имя с внутренним IP-адресом, добавив следующую строку в hosts:
10.74.34.10 bitrix-site.ru www.bitrix-site.ru

После этого ping пошел и с localhost. Затем, не выходя из консоли, выполняем команду:

curl -I https://bitrix-site.ru

На выходе следующая ошибка:
curl: (60) Peer’s Certificate issuer is not recognized

Получается, сертификат на сайте не является доверенным. Но firefox и другие браузеры убеждают в обратном. Если у вас действительно доверенный сертификат, а тем более коммерческий и он не выпускался автоматически через BitrixVM(Let’s Encrypt), с большой долей вероятности nginx не знает о цепочке сертификатов. Эту проблему легко решить.
Для начала получим цепочку сертификатов. Проще всего её скачать напрямую из браузера.
Например в firefox необходимо нажать на «замок» слева от доменного имени, затем выбрать пункт «Защищенное соединение», в нем — «Подробнее».

Откроется отдельное окно с подробной информацией о защите вашего сайта. Нас интересует кнопка «Посмотреть сертификат».

После нажатия на кнопку попадаем на вкладку с детальной информацией о сертификате. Листаем вниз до секции «Разное»

Скачиваем цепочку сертификатов и переносим её на сервер любым удобным способом.

Остается найти приватный ключ и сам сертификат для его повторной привязки к нашему сайту через окружение BitrixVM. Мы же не хотим вручную прописывать пути к файлам сертификата в конфиге nginx.

Заходим в виртуальное окружение BitrixVM, выполнив команду в консоли сервера:

cd /root && ./menu.sh

Далее выбираем пункт «8. Manage pool web servers», затем «3.Configure certificates»

В таблице с сайтами нам потребуются пути из колонок «Certificate» и «Key». Они указаны относительно папки /etc/nginx. Переходим в /etc/nginx/certs/default и копируем сертификат с ключом в директорию, рядом с файлом цепочки.
После чего возвращаемся в окружение BitrixVM и настраиваем собственный сертификат по инструкции из официальной документации 1С-Битрикс.

В пункте «10. Background pool tasks» окружения BitrixVM убеждаемся, что задание изменения сертификата завершено успешно. После чего можно повторно запустить проверку системы в админке Битрикс.

В моем случае причина была именно в цепочке сертификатов. И это не первый случай, что и побудило к написанию статьи.