[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"/ru/kb/faq/hosting/kornevoj-sertifikat-ucKbData":3},{"page":4,"pages":138,"recommendedPages":139,"category":81,"categoryTree":81,"total":15,"currentOrder":167,"activeManualCategoryId":81,"tag":-1},{"route":5,"uuid":8,"title":9,"excerpt":10,"content":11,"view_count":12,"published_at":13,"modified_at":13,"like":14,"category":17,"hero_image":74,"seo_metadata":75,"schema_org_metadata":79,"open_graph_metadata":82,"sections":83,"tags":125,"breadcrumbs":126,"images":133},{"language":6,"path":7},"ru","/kb/faq/hosting/kornevoj-sertifikat-uc","a7d870aa-009c-dda6-763b-0c7850308e0b","Установка корневого сертификата УЦ для PHP на виртуальном хостинге","Если сайт обращается к внешнему сервису и получает ошибку проверки SSL-сертификата, причина может быть в том, что на сервере нет корневого сертификата удостоверяющего центра, выпустившего сертификат этого сервиса. В статье разберем, как определить, что дело именно в этом, найти нужный сертификат, подключить его в PHP и проверить результат.","\n\u003Cp>Если сайт обращается к внешнему сервису и получает ошибку проверки SSL-сертификата, причина может быть в том, что на сервере нет корневого сертификата удостоверяющего центра, выпустившего сертификат этого сервиса.\u003C/p>\n\n\n\n\u003Cp>В статье разберем, как определить, что дело именно в этом, найти нужный сертификат, подключить его в PHP и проверить результат. Отдельно рассмотрим особенность сайтов на WordPress.\u003C/p>\n\n\n\n\u003Cp>В примерах используется \u003Ccode>DigiCert Assured ID Root CA\u003C/code> – действующий корневой сертификат, который на некоторых серверах виртуального хостинга отсутствует. Вместо него подставляйте тот, который нужен вам: порядок действий одинаковый.\u003C/p>\n\n\n\n\u003Ch2 id=\"kogda-nuzhno-ustanavlivat-kornevoy-sertifikat\">Когда нужно устанавливать корневой сертификат\u003C/h2>\n\n\n\n\u003Ch3 id=\"chto-takoe-kornevoy-sertifikat\">Что такое корневой сертификат\u003C/h3>\n\n\n\n\u003Cp>При HTTPS-соединении сайт получает от сервера сертификат и должен подтвердить его подлинность. Сертификат сервера подписан удостоверяющим центром (УЦ), сертификат УЦ – вышестоящим, и так до \u003Cstrong>корневого сертификата\u003C/strong>, который никем не подписан и служит отправной точкой доверия.\u003C/p>\n\n\n\n\u003Cp>Проверка проходит, только если корневой сертификат центра сертификации заранее есть на сервере – в наборе доверенных. На серверах виртуального хостинга такие сертификаты хранятся отдельными файлами в директории \u003Ccode>/etc/ssl/certs/\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ls /etc/ssl/certs/ | grep -i DigiCert\nDigiCert_Assured_ID_Root_G2.pem\nDigiCert_Assured_ID_Root_G3.pem\nDigiCert_Global_Root_G2.pem\nDigiCert_Global_Root_G3.pem\nDigiCert_TLS_ECC_P384_Root_G5.pem\nDigiCert_TLS_RSA4096_Root_G5.pem\nDigiCert_Trusted_Root_G4.pem\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Состав набора может отличаться от стандартного для дистрибутива, поэтому нужного корневого сертификата на сервере может не быть. В любом случае в набор не входят корпоративные и ведомственные УЦ с ограниченной сферой применения – если сервис использует сертификат такого УЦ, проверка не пройдет.\u003C/p>\n\n\n\n\u003Cp>На виртуальном хостинге у пользователя нет прав на запись в директорию \u003Ccode>/etc/ssl/certs/\u003C/code> – добавить сертификат напрямую нельзя. Поэтому недостающий сертификат подключается иначе: в директории сайта создается отдельный файл, а путь к нему указывается в PHP отдельной директивой – как показано далее в статье.\u003C/p>\n\n\n\n\u003Ch3 id=\"kak-ponyat-chto-sertifikata-net-na-servere\">Как понять, что сертификата нет на сервере\u003C/h3>\n\n\n\n\u003Cp>Проблема проявляется по-разному, но один из характерных признаков – ошибка в исходящих запросах из PHP. Например:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>cURL error 60: SSL certificate problem: unable to get local issuer certificate\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>cURL error 60: SSL certificate problem: self signed certificate in certificate chain\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>На стороне сайта это выглядит как неработающая интеграция: не проходит оплата, не отправляются данные во внешнюю систему. Сам сайт при этом открывается нормально.\u003C/p>\n\n\n\n\u003Cp>Чтобы проверить причину точно, узнайте, какой УЦ выпустил сертификат сервиса. Подставьте домен сервиса:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>openssl s_client -connect example-service.ru:443 -servername example-service.ru -showcerts &lt;/dev/null 2&gt;/dev/null | sed -n '/Certificate chain/,/^---/p'\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В выводе \u003Ccode>s:\u003C/code> – кому выдан сертификат, \u003Ccode>i:\u003C/code> – кто выдал. Нужен issuer последнего сертификата в цепочке. Например:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>Certificate chain\n 0 s:jurisdictionC = US, jurisdictionST = Utah, ... CN = assured-id-root-ca.chain-demos.digicert.com\n   i:C = US, O = \"DigiCert, Inc.\", CN = DigiCert Assured ID TLS RSA4096 SHA256 2022 CA1\n 1 s:C = US, O = \"DigiCert, Inc.\", CN = DigiCert Assured ID TLS RSA4096 SHA256 2022 CA1\n   i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Assured ID Root CA\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В этом примере недостающий корневой сертификат удостоверяющего центра – \u003Ccode>DigiCert Assured ID Root CA\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Чтобы найти его среди установленных, начните с поиска по организации, которая выпустила сертификат, – это поле \u003Ccode>O =\u003C/code> из issuer, который вы уже определили. Используйте одно слово без пробелов:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ls /etc/ssl/certs/ | grep -i digicert\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если результатов немного – сразу сравнивайте их с полным искомым названием. Если результатов много (а у крупных УЦ вроде DigiCert, Sectigo или GlobalSign на сервере может быть несколько десятков их сертификатов), сузьте список вторым \u003Ccode>grep\u003C/code> по еще одному слову – уже из полного названия самого сертификата (\u003Ccode>CN =\u003C/code>), а не организации.\u003C/p>\n\n\n\n\u003Cp>Например, для сертификата \u003Ccode>DigiCert Assured ID Root CA\u003C/code> можно использовать команду:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ls /etc/ssl/certs/ | grep -i digicert | grep -i assured\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Пример вывода: \u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>DigiCert_Assured_ID_Root_G2.pem\nDigiCert_Assured_ID_Root_G3.pem\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Далее вывод нужно разобрать вручную: сравните каждое найденное имя файла целиком с точным названием, которое вы искали, – включая версию. Сертификаты одного УЦ часто выпускаются в нескольких версиях (\u003Ccode>Root CA\u003C/code>, \u003Ccode>Root G2\u003C/code>, \u003Ccode>Root G3 \u003C/code>и так далее), и это разные сертификаты: наличие одной версии не означает, что нужная вам версия тоже установлена. В примере выше есть G2 и G3, но нет версии без номера – именно ее и не хватает.\u003C/p>\n\n\n\n\u003Cp>Если среди найденного нет точного совпадения (или вывод вовсе пустой) – сертификата нет и его нужно установить.\u003C/p>\n\n\n\n\u003Ch3 id=\"gde-skachat-fayl-sertifikata\">Где скачать файл сертификата\u003C/h3>\n\n\n\n\u003Cp>У каждого крупного УЦ есть официальный раздел с корневыми сертификатами. Как правило, корневые сертификаты УЦ размещаются на его официальном сайте, в разделе поддержки или документации. Скачивайте файл только с этого официального сайта.\u003C/p>\n\n\n\n\u003Cp>Учтите, что удостоверяющий центр мог сменить владельца, и его сертификаты публикует уже другая компания. Например, сертификаты Thawte, GeoTrust и RapidSSL сейчас размещены в репозитории DigiCert. Если УЦ непубличный – корпоративный или ведомственный, – запросите файл у администратора сервиса.\u003C/p>\n\n\n\n\u003Cp>Нужен формат PEM – текстовый файл с содержимым вида:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>-----BEGIN CERTIFICATE-----\n(набор символов в кодировке Base64)\n-----END CERTIFICATE-----\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Расширение может быть \u003Ccode>.pem\u003C/code> или \u003Ccode>.crt\u003C/code>. Если файл скачался в двоичном формате DER (это можно понять по нечитаемым символам, если открыть файл в текстовом редакторе), его нужно перевести в PEM – как это сделать, показано в шаге 2.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Устанавливайте только сертификат того УЦ, который обслуживает нужный вам сервис. Любой добавленный корневой сертификат означает, что PHP будет считать подлинным всякое соединение, подписанное этим УЦ.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"ustanovka-kornevogo-sertifikata\">Установка корневого сертификата\u003C/h2>\n\n\n\n\u003Cp>Файл сертификата размещается в директории сайта, объединяется с набором доверенных корневых сертификатов в один файл, после чего путь к этому файлу указывается в директиве PHP openssl.cafile. Все команды выполняются \u003Ca href=\"https://beget.com/ru/kb/how-to/ssh/kak-podklyuchitsya-po-ssh-iz-windows?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=certificate_php&amp;utm_content=kb_ssh\">по SSH\u003C/a> из корневой директории сайта – внутри \u003Ccode>public_html\u003C/code>.\u003C/p>\n\n\n\n\u003Ch3 id=\"shag-1-sozdayte-direktoriyu-dlya-sertifikata\">Шаг 1. Создайте директорию для сертификата\u003C/h3>\n\n\n\n\u003Cp>Выполните команду, находясь в корневой директории сайта:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>mkdir cert\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"shag-2-zagruzite-fayl-sertifikata\">Шаг 2. Загрузите файл сертификата\u003C/h3>\n\n\n\n\u003Cp>Адрес для скачивания сертификата возьмите с сайта нужного УЦ. Ниже приведен пример:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>wget -O cert/root.crt https://cacerts.digicert.com/DigiCertAssuredIDRootCA.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если скачанный файл окажется в двоичном формате DER, переведите его в PEM – например, при открытии такого файла в текстовом редакторе вместо \u003Ccode>-----BEGIN CERTIFICATE-----\u003C/code> видны нечитаемые символы. Выполните команду на сервере:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>openssl x509 -inform DER -in cert/root.crt -out cert/root.pem\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Команда не выводит сообщений на экран при успешном выполнении. Файл сертификата после преобразования сохраняется по пути \u003Ccode>cert/root.pem\u003C/code>. Проверьте его следующей командой:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>openssl x509 -in cert/root.pem -noout -subject -fingerprint -sha256\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Команда выведет название УЦ и отпечаток – сверьте их с тем, что опубликовано на сайте УЦ.\u003C/p>\n\n\n\n\u003Cp>В выводе \u003Ccode>openssl s_client\u003C/code> из предыдущего раздела цепочка может обрываться, если сервис, к которому вы обращаетесь, не отдает промежуточный сертификат: в ответе присутствует только сертификат самого сервиса. В этом случае скачайте с сайта УЦ еще и промежуточный сертификат и сохраните его в ту же директорию:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>wget -O cert/intermediate.pem ссылка_на_промежуточный_сертификат\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Чтобы проверить, сколько сертификатов прислал сервис (в примере ниже – \u003Ccode>example-service.ru\u003C/code>), выполните команду:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>openssl s_client -connect example-service.ru:443 -servername example-service.ru -showcerts &lt;/dev/null 2&gt;/dev/null | grep -c \"BEGIN CERTIFICATE\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если результат \u003Ccode>1\u003C/code> – промежуточного сертификата в ответе нет, его нужно скачать отдельно. Если больше – сервис уже присылает его сам, докачивать ничего не нужно.\u003C/p>\n\n\n\n\u003Ch3 id=\"shag-3-soberite-obedinennyy-fayl-sertifikatov\">Шаг 3. Соберите объединенный файл сертификатов\u003C/h3>\n\n\n\n\u003Cp>Директива \u003Ccode>openssl.cafile\u003C/code>, которую мы пропишем на шаге 5, указывает PHP файл со списком доверенных корневых сертификатов. Этот файл становится основным источником доверия, поэтому он должен содержать не только ваш сертификат, но и весь остальной набор.\u003C/p>\n\n\n\n\u003Cp>Если указать файл с одним сертификатом, сайт потеряет доверие ко всем остальным сервисам. Поэтому собираем в один файл всё содержимое директории \u003Ccode>/etc/ssl/certs/\u003C/code> вместе с новым сертификатом. Используйте эту команду, чтобы объединить файлы без повреждения структуры сертификатов:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>(for f in /etc/ssl/certs/*.pem; do cat \"$f\"; echo; done; cat cert/root.pem) &gt; cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Промежуточный сертификат, если он нужен, добавляется тем же способом:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>(for f in /etc/ssl/certs/*.pem; do cat \"$f\"; echo; done; cat cert/root.pem cert/intermediate.pem) &gt; cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Проверьте, что сертификатов в получившемся файле стало больше, чем было в директории \u003Ccode>/etc/ssl/certs/\u003C/code>, и что и что между сертификатами сохраняются переносы строк:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ls /etc/ssl/certs/*.pem | wc -l\ngrep -c 'BEGIN CERTIFICATE' cert/ca-bundle-custom.crt\ngrep -c 'END CERTIFICATE-----BEGIN CERTIFICATE' cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Первая команда показывает количество исходных сертификатов, вторая должна быть больше на 1 (или на 2, если добавлялся промежуточный сертификат). Третья команда должна вернуть 0: любое другое значение означает, что в файле есть склеенные сертификаты и объединенный файл нужно пересобрать.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Состав директории \u003Ccode>/etc/ssl/certs/\u003C/code> может со временем меняться вместе с обновлениями сервера, а собранная вами копия – нет. Если через несколько месяцев появятся ошибки SSL при обращении к сервисам, которые раньше работали, пересоберите файл той же командой.\u003C/div>\u003C/div>\n\n\n\n\u003Ch3 id=\"shag-4-opredelite-polnyy-put-k-faylu\">Шаг 4. Определите полный путь к файлу\u003C/h3>\n\n\n\n\u003Cp>В \u003Ccode>php.ini\u003C/code> путь к файлу указывается в абсолютном виде. Чтобы его получить, выполните команду:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>realpath cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Путь строится по схеме:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>/home/[первая буква логина]/[логин]/[директория сайта]/public_html/cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Логин аккаунта указан в правом верхнем углу панели управления. Директорию, к которой привязан домен, можно посмотреть в разделе «\u003Ca href=\"https://cp.beget.com/sites?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=certificate_php&amp;utm_content=cp_sites\">Сайты\u003C/a>». Пример результата:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>/home/b/betutorial/cert.betutorial.ru/public_html/cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"shag-5-podklyuchite-fayl-v-php\">Шаг 5. Подключите файл в PHP\u003C/h3>\n\n\n\n\u003Cp>Способ зависит от режима работы PHP – \u003Ccode>CGI\u003C/code> или \u003Ccode>mod_php\u003C/code> (используется по умолчанию). Посмотреть режим можно в разделе «\u003Ca href=\"https://cp.beget.com/sites?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=certificate_php&amp;utm_content=cp_sites\">Сайты\u003C/a>» панели управления. Нажмите на иконку \u003Cimg src=\"https://cp.beget.com/shared/Ag_YTBwUQkacmQzV7e20m4mPcBXZ-AyO/image3_1.png\" class=\"wp-inline-image\"> в строке с именем сайта:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/lMVLgYoQ-qN7Rq2uGKvE1naEIKH12QaJ/snimok-ekrana-2026-09-15-183847.png\" alt=\"сайт из раздела Сайты\">\u003C/div>\n\n\n\n\u003Cp>В открывшемся окне посмотрите, активирован ли&nbsp;\u003Cstrong>Режим cgi\u003C/strong>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/uosRapq5-P76jt1UY2SghklqYxBX1Yrt/snimok-ekrana-2026-09-15-183854.png\" alt=\"настройки сайта из раздела Сайты\">\u003C/div>\n\n\n\n\u003Cp>\u003Cstrong>Если режим CGI включен\u003C/strong>, добавьте в файл \u003Ccode>cgi-bin/php.ini\u003C/code> директиву \u003Ccode>openssl.cafile\u003C/code> и укажите путь до файла \u003Ccode>ca-bundle-custom.crt\u003C/code> из шага 4:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>openssl.cafile = /home/b/betutorial/cert.betutorial.ru/public_html/cert/ca-bundle-custom.crt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Открыть файл на редактирование можно командой \u003Ccode>vim cgi-bin/php.ini\u003C/code> или через файловый менеджер панели управления.\u003C/p>\n\n\n\n\u003Cp>\u003Cstrong>Если режим CGI выключен\u003C/strong>, директивы из cgi-bin/php.ini не применяются – даже если создать этот файл вручную. Прописать путь можно только через конфигурацию виртуального хоста, которая доступна технической поддержке. Напишите тикет из панели управления и укажите домен сайта и полный путь к объединенному файлу из шага 4.\u003C/p>\n\n\n\n\u003Ch2 id=\"osobennost-saytov-na-wordpress\">Особенность сайтов на WordPress\u003C/h2>\n\n\n\n\u003Cp>Ядро WordPress не использует ни системный набор, ни файл из \u003Ccode>openssl.cafile\u003C/code> – оно берет сертификаты из собственного файла \u003Ccode>wp-includes/certificates/ca-bundle.crt\u003C/code>. Поэтому сертификат нужно дополнительно добавить в этот файл – независимо от режима PHP:\u003C/p>\n\n\n\n\u003Col>\u003Cli>Проверьте, что сертификата в файле еще нет\u003Cstrong>.\u003C/strong> \u003C/li>\u003C/ol>\n\n\n\n\u003Cp>В этом файле, в отличие от системного набора, у каждого сертификата рядом есть читаемое название. При помощи утилиты \u003Ccode>grep\u003C/code> найдите название по организации, которая выпустила сертификат, и при необходимости уточните запрос вторым словом из названия сертификата:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>cat wp-includes/certificates/ca-bundle.crt | grep -i digicert | grep -i assured\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Сравните результат с точным названием, которое искали, – так же, как в разделе «Как понять, что сертификата нет на сервере». Если точного совпадения нет – сертификата в файле нет, и его нужно добавить.\u003C/p>\n\n\n\n\u003Col start=\"2\">\u003Cli>Скопируйте сертификат.\u003C/li>\u003C/ol>\n\n\n\n\u003Cp>Выведите содержимое файла с корневым сертификатом:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>cat cert/root.pem\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Скопируйте блок целиком, вместе со строками \u003Ccode>-----BEGIN CERTIFICATE-----\u003C/code> и \u003Ccode>-----END CERTIFICATE-----\u003C/code>.\u003C/p>\n\n\n\n\u003Col start=\"3\">\u003Cli>Вставьте сертификат в конец файла \u003Ccode>wp-includes/certificates/ca-bundle.crt\u003C/code>.\u003C/li>\u003C/ol>\n\n\n\n\u003Cp>В файле \u003Ccode>wp-includes/certificates/ca-bundle.crt\u003C/code> уже есть остальные корневые сертификаты, поэтому необходимо добавить только новый корневой сертификат. Откройте файл на редактирование командой \u003Ccode>vim wp-includes/certificates/ca-bundle.crt\u003C/code> или через файловый менеджер панели управления и вставьте скопированный сертификат в конец файла.\u003C/p>\n\n\n\n\u003Cp>Если добавляете и корневой, и промежуточный сертификат, вставляйте сначала корневой, затем промежуточный.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Файл \u003Ccode>ca-bundle.crt\u003C/code> входит в состав ядра и перезаписывается при обновлении WordPress – после обновления сертификат придется добавить заново.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"proverka\">Проверка\u003C/h2>\n\n\n\n\u003Cp>Проверять нужно PHP-скриптом: директива \u003Ccode>openssl.cafile\u003C/code> относится только к PHP, консольная утилита \u003Ccode>curl\u003C/code> ее не читает и использует свой набор сертификатов.\u003C/p>\n\n\n\n\u003Cp>Скрипт показывает, какой файл использует PHP, и проверяет соединение с вашим сервисом и с обычным сайтом. Вторая проверка нужна, чтобы убедиться, что доверие к остальным сертификатам не потерялось. Укажите в \u003Ccode>$endpoints\u003C/code> адрес вашего сервиса, контрольный оставьте как есть. Для примера в статье используется адрес \u003Ccode>https://assured-id-root-ca.chain-demos.digicert.com\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>&lt;?php\n$endpoints = [\n    'Целевой сервис'   =&gt; 'https://example-service.ru',\n    'Контрольный сайт' =&gt; 'https://www.google.com',\n];\n$cafile = ini_get('openssl.cafile');\necho '&lt;pre&gt;openssl.cafile: ' . ($cafile !== '' ? htmlspecialchars($cafile) : 'не задан') . \"\\n\";\nif ($cafile !== '' &amp;&amp; is_readable($cafile)) {\n    echo 'Сертификатов в файле: '\n        . substr_count(file_get_contents($cafile), 'BEGIN CERTIFICATE') . \"\\n\";\n}\necho \"&lt;/pre&gt;\";\nforeach ($endpoints as $name =&gt; $url) {\n    echo '&lt;pre&gt;' . htmlspecialchars($name) . ' – ' . htmlspecialchars($url) . \"\\n\";\n    $ch = curl_init($url);\n    curl_setopt_array($ch, [\n        CURLOPT_RETURNTRANSFER =&gt; true,\n        CURLOPT_NOBODY         =&gt; true,\n        CURLOPT_SSL_VERIFYPEER =&gt; true,\n        CURLOPT_SSL_VERIFYHOST =&gt; 2,\n        CURLOPT_CERTINFO       =&gt; true,\n        CURLOPT_CONNECTTIMEOUT =&gt; 10,\n        CURLOPT_TIMEOUT        =&gt; 20,\n    ]);\n    $ok       = curl_exec($ch) !== false;\n    $certinfo = curl_getinfo($ch, CURLINFO_CERTINFO);\n    if ($ok) {\n        echo \"SSL verification: OK\\n\";\n        if (!empty($certinfo)) {\n            $last = end($certinfo);\n            echo 'Сертификат выдан: ' . htmlspecialchars($last['Issuer'] ?? '–') . \"\\n\";\n        }\n    } else {\n        echo 'ОШИБКА (' . curl_errno($ch) . '): ' . htmlspecialchars(curl_error($ch)) . \"\\n\";\n    }\n    curl_close($ch);\n    echo '&lt;/pre&gt;';\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Создайте на сервере файл \u003Ccode>check-cert.php\u003C/code> в корневой директории сайта (например, командой \u003Ccode>vim check-cert.php\u003C/code>), вставьте в него код скрипта и откройте по адресу \u003Ccode>https://ваш-домен.ru/check-cert.php\u003C/code>. Оба адреса должны дать \u003Ccode>SSL verification: OK\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Как читать результат:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Cstrong>ошибка у целевого сервиса, контрольный работает\u003C/strong> – добавлен не тот сертификат или неверно указан путь. Проверьте, что нужный УЦ есть в файле, и сверьте путь в \u003Ccode>openssl.cafile\u003C/code>;\u003C/li>\u003Cli>\u003Cstrong>ошибка у контрольного сайта\u003C/strong> – в объединенный файл не попал системный набор, пересоберите его по шагу 3;\u003C/li>\u003Cli>\u003Cstrong>openssl.cafile: не задан\u003C/strong> – директива не применилась. При включенном режиме CGI проверьте \u003Ccode>cgi-bin/php.ini\u003C/code>, при \u003Ccode>mod_php\u003C/code> нужно обратиться в техническую поддержку.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Ядро WordPress использует свой файл сертификатов, поэтому его нужно проверить отдельно. Создайте файл \u003Ccode>check-cert-wp.php\u003C/code> в корневой директории WordPress-сайта – там же, где расположен файл \u003Ccode>wp-load.php\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>&lt;?php\nrequire_once __DIR__ . '/wp-load.php';\n$endpoints = [\n    'Целевой сервис'   =&gt; 'https://example-service.ru',\n    'Контрольный сайт' =&gt; 'https://www.google.com',\n];\nforeach ($endpoints as $name =&gt; $url) {\n    $response = wp_remote_get($url, ['timeout' =&gt; 20, 'sslverify' =&gt; true]);\n    echo '&lt;pre&gt;' . esc_html($name) . ': ';\n    echo is_wp_error($response)\n        ? 'ОШИБКА – ' . esc_html($response-&gt;get_error_message())\n        : 'SSL verification: OK';\n    echo '&lt;/pre&gt;';\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>После проверки удалите оба скрипта: оставлять на сайте служебные файлы с диагностикой небезопасно. Затем проверьте саму интеграцию, для которой устанавливался сертификат, – например, выполните тестовый запрос к сервису или оформите тестовый заказ.\u003C/p>\n\n\n\n\u003Ch2 id=\"zaklyuchenie\">Заключение\u003C/h2>\n\n\n\n\u003Cp>Чтобы PHP доверял сервису, чей УЦ отсутствует в системе, нужно определить название этого УЦ, скачать его корневой сертификат с официального сайта, собрать объединенный файл из системного набора и своего сертификата и прописать путь к нему в \u003Ccode>openssl.cafile\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Главное – не указывать в директиве файл с одним сертификатом: он заменяет собой весь список доверенных корней. На сайтах на CMS WordPress сертификат дополнительно добавляется в \u003Ccode>ca-bundle.crt\u003C/code> ядра CMS.\u003C/p>\n\n\n\n\u003Cp>Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “\u003Ca href=\"https://cp.beget.com/support?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=certificate_php&amp;utm_content=cp_support\">Помощь и поддержка\u003C/a>”), а если вы захотите обсудить, как скачать корневые сертификаты или установить \u003Ca href=\"https://beget.com/ru/kb/faq/hosting/ustanovka-sertifikata-mincifry-dlya-sajta?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=certificate_php&amp;utm_content=kb_sertifikat_mincifry\">сертификат НУЦ Минцифры\u003C/a>, – ждем вас в нашем\u003Ca href=\"https://t.me/beget_chat\"> сообществе\u003C/a> в Telegram.\u003C/p>\n",22,"2026-09-16T15:14:29.000Z",{"count":15,"liked":16},0,false,{"route":18,"title":20,"tags":21,"breadcrumbs":66,"uuid":67,"parent_uuid":68,"default_page_path":26,"seo_metadata":69},{"language":6,"path":19},"/kb/faq/hosting","Хостинг",[22,27,31,35,39,43,47,51,54,58,62],{"id":23,"title":24,"seo_metadata":25},"cms","CMS",{"title":26,"description":26,"header":26,"keywords":26},"",{"id":28,"title":29,"seo_metadata":30},"virtualnyj-hosting","Виртуальный хостинг",{"title":26,"description":26,"header":26,"keywords":26},{"id":32,"title":33,"seo_metadata":34},"ftp","FTP",{"title":26,"description":26,"header":26,"keywords":26},{"id":36,"title":37,"seo_metadata":38},"mysql","MySQL",{"title":26,"description":26,"header":26,"keywords":26},{"id":40,"title":41,"seo_metadata":42},"ssh","SSH",{"title":26,"description":26,"header":26,"keywords":26},{"id":44,"title":45,"seo_metadata":46},"perenos-sajta","Перенос сайта",{"title":26,"description":26,"header":26,"keywords":26},{"id":48,"title":49,"seo_metadata":50},"crontab","Crontab",{"title":26,"description":26,"header":26,"keywords":26},{"id":52,"title":52,"seo_metadata":53},"htaccess",{"title":26,"description":26,"header":26,"keywords":26},{"id":55,"title":56,"seo_metadata":57},"php","PHP",{"title":26,"description":26,"header":26,"keywords":26},{"id":59,"title":60,"seo_metadata":61},"perl","Perl",{"title":26,"description":26,"header":26,"keywords":26},{"id":63,"title":64,"seo_metadata":65},"yuridicheskie-voprosy","Юридические вопросы",{"title":26,"description":26,"header":26,"keywords":26},[],"cdc8de8b-c097-2c9b-9132-61c926d8c38c","80213437-0399-4b4f-2333-426bb5050534",{"title":70,"description":71,"header":72,"keywords":73},"FAQ. Хостинг – Beget","Ответы на часто задаваемые вопросы о хостинге на сайте Beget","FAQ. Хостинг","хостинг, FAQ",{"src":26,"text":26},{"title":76,"description":77,"keywords":78},"Установка корневого сертификата УЦ","Подробная инструкция по установке корневого сертификата удостоверяющего центра (УЦ) для PHP на виртуальном хостинге","корневой сертификат УЦ на хостинг сервере, https сертификат для сайта, DigiCert Assured ID Root CA",{"faq":80,"how_to":81,"product":81},[],null,{},[84,88,92,95,98,101,104,107,110,113,116,119,122],{"level":85,"name":86,"anchor":87},1,"Когда нужно устанавливать корневой сертификат","kogda-nuzhno-ustanavlivat-kornevoy-sertifikat",{"level":89,"name":90,"anchor":91},2,"Что такое корневой сертификат","chto-takoe-kornevoy-sertifikat",{"level":89,"name":93,"anchor":94},"Как понять, что сертификата нет на сервере","kak-ponyat-chto-sertifikata-net-na-servere",{"level":89,"name":96,"anchor":97},"Где скачать файл сертификата","gde-skachat-fayl-sertifikata",{"level":85,"name":99,"anchor":100},"Установка корневого сертификата","ustanovka-kornevogo-sertifikata",{"level":89,"name":102,"anchor":103},"Шаг 1. Создайте директорию для сертификата","shag-1-sozdayte-direktoriyu-dlya-sertifikata",{"level":89,"name":105,"anchor":106},"Шаг 2. Загрузите файл сертификата","shag-2-zagruzite-fayl-sertifikata",{"level":89,"name":108,"anchor":109},"Шаг 3. Соберите объединенный файл сертификатов","shag-3-soberite-obedinennyy-fayl-sertifikatov",{"level":89,"name":111,"anchor":112},"Шаг 4. Определите полный путь к файлу","shag-4-opredelite-polnyy-put-k-faylu",{"level":89,"name":114,"anchor":115},"Шаг 5. Подключите файл в PHP","shag-5-podklyuchite-fayl-v-php",{"level":85,"name":117,"anchor":118},"Особенность сайтов на WordPress","osobennost-saytov-na-wordpress",{"level":85,"name":120,"anchor":121},"Проверка","proverka",{"level":85,"name":123,"anchor":124},"Заключение","zaklyuchenie",[],[127,131],{"route":128,"title":130},{"language":6,"path":129},"/kb/faq","Руководство по услугам",{"route":132,"title":20},{"language":6,"path":19},[134,136],{"src":135},"https://cp.beget.com/shared/lMVLgYoQ-qN7Rq2uGKvE1naEIKH12QaJ/snimok-ekrana-2026-09-15-183847.png",{"src":137},"https://cp.beget.com/shared/uosRapq5-P76jt1UY2SghklqYxBX1Yrt/snimok-ekrana-2026-09-15-183854.png",[],[140,149,158],{"route":141,"uuid":143,"title":144,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":81,"category":81,"hero_image":81,"seo_metadata":81,"schema_org_metadata":81,"open_graph_metadata":81,"sections":145,"tags":146,"breadcrumbs":147,"images":148},{"language":6,"path":142},"/kb/faq/hosting/perenos-sajta","8e115ed8-6a48-910e-3d11-e7da73e7d1ae","Перенос сайта с одного хостинга на другой",[],[],[],[],{"route":150,"uuid":152,"title":153,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":81,"category":81,"hero_image":81,"seo_metadata":81,"schema_org_metadata":81,"open_graph_metadata":81,"sections":154,"tags":155,"breadcrumbs":156,"images":157},{"language":6,"path":151},"/kb/faq/hosting/dostup-k-serveram","9e797b18-e193-9867-49d3-4db32122f969","Доступ к серверам",[],[],[],[],{"route":159,"uuid":161,"title":162,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":81,"category":81,"hero_image":81,"seo_metadata":81,"schema_org_metadata":81,"open_graph_metadata":81,"sections":163,"tags":164,"breadcrumbs":165,"images":166},{"language":6,"path":160},"/kb/faq/hosting/nastrojka-sajta","fa9441fe-6087-14f3-5067-429498dfa8a9","Настройка сайта",[],[],[],[],"popularity-desc"]