Глава 1. Что такое fullchain-сертификат простым языком и зачем он нужен?

Чтобы ответить на вопрос, что такое fullchain-сертификат, надо понять какие они бывают. Каждый "приличный" сайт в интернете имеет SSL-сертификат, подтверждающий его подлинность и принадлежность к той организации, которая его поддерживает. Самый простой способ его посмотреть - через браузер:

Информация о сертификате Google
Информация о сертификате Google

В данном случае, мы видим сертификат Google и публичную информацию о нем: серийный номер, срок действия и тд

Этот сертификат называется «конечным» или END‑сертификатом, поскольку находится последним в цепочки сертификатов, заверивших его подлинность.

Помимо него, в иерархии сертификатов — есть ещё 2:

1. «Рутовый» \ Root CA
2. Промежуточный \ Middle \ intermediate

Fullchain-сертификат = Root + Middle + END, собранные в одном файле.

Так выглядят конечный сертификат Google и его полная цепочка в кодировке Base-64:

Зачем нужен Fullchain-сертификат? Множеству разных сервисов, для корректной работы нужна именно полная цепочка. Конечный сертификат они воспринимают как не валидный.

Глава 2. Зачем нужна автоматизация для получения Fullchain-сертификата?

Выпустив коммерческий сертификат, обычно, вы получаете 3 файла:

  1. Приватный ключ

  2. Конечный сертификат в формате .crt или .pem

  3. Файл с раcширением .csr (Certificate Signing Request)

Полной цепочки среди них нет и вам нужно "собрать" её самостоятельно. Если ваш компьютер под управлением ОС Windows, можно импортировать файл .crt в диспетчер сертификатов (Certmgr.exe), и дальше экспортировать по очереди каждую из частей цепочки в файл с кодировкой Base-64, чтобы в конце собрать их в один файл, не ошибившись в последовательности. Есть и другие способы ручной сборки, разбирать которые мы не будем. Факт в том, что это ручной труд, который можно автоматизировать. И при желании, полученный Fullchain можно сразу задействовать в дальнейшей автоматизации, например - импортировать \ устанавливать на нужные сервера, отправлять на почту ответственным лицам.

Глава 3. Что нужно для работы автоматизации?

  1. Выход в интернет с машины, на которой выполняется скрипт. В процессе выполнения будет происходить обращение к OCSP-респондерам CA для валидации сертификата и построение полной цепочки с помощью протокола OCSP (Online Certificate Status Protocol)

  2. OpenSSL для конвертации сертификатов из одного типа в другой. Можно скачать тут.

Глава 4. Техническое описание решения

Устанавливаем OpenSSL, переходим в директорию с исполняемым файлом (обычно C:\Program Files\OpenSSL-Win64\bin). После - создаем папки:
1. END_CERT из которой скрипт будет брать конечный сертификат
2. DONE в которой скрипт будет оставлять готовый fullchain

Добавляем блок с переменными, в которых будут монолитные значения :

#переменные
$Bin_Path = "C:\Program Files\OpenSSL-Win64\bin"
$Cert_Path = "C:\Program Files\OpenSSL-Win64\bin\END_СERT"
$Done_Path = "C:\Program Files\OpenSSL-Win64\bin\DONE"

Определяем полное имя файла конечного сертификата и создаем переменную $Cert для записи данных о нем:

$END_CERT = (Get-Item -Path $Cert_Path\*).Fullname
#записываем данные сертификата в переменную
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($END_CERT)
содержимое переменной $Cert
содержимое переменной $Cert

Обрабатываем значение из элемента массива Subject, формируя имя файла, которым будет назван fullchain-сертификат:

#генерируем имя файла нового сертфииката
$Cert_Name = $Cert.Subject
$Cert_Name = $Cert_Name.TrimStart('CN=')
$Cert_Name = $Cert_Name.Split(',')[0]
$Cert_Name = $Cert_Name.Replace('*','wildcard')

Создаем полную цепочку, путем обращения к OCSP-респондерам CA и смотрим её содержимое:

#создание цепочки
$Chain = new-object security.cryptography.x509certificates.x509chain
$Chain.Build($Cert)
 
#краткий обзор сертификатов в цепочке
$Chain.ChainElements.Certificate | Select-Object Subject, NotBefore, NotAfter
краткий обзор сертификатов в цепочке
краткий обзор сертификатов в цепочке

Экспортируем содержимое каждого сертификата цепочки в файл с двоичной кодировкой DER:

$Content_Type = [Security.Cryptography.X509Certificates.X509ContentType]::Cert
 
$i=1;
    $Chain.ChainElements.Certificate | Select-Object | ForEach-Object {
    $params = @{
        value = $($_.Export($Content_Type))
     path = "C:\Program Files\OpenSSL-Win64\bin\$i.pem"
        encoding = "byte"}
        $i+=1
    set-content @params
    }

Переходим в директорию с исполняемым файлом (openssl.exe) и кодируем полученные сертификаты из формата DER в PEM (Base-64).После чего, объединяем содержимое всех сертификатов в один и перемещаем его в папку DONE, а исходники \ промежуточные файлы - удаляем:

cd $Bin_Path
 
#кодировка в Base64
Get-Item *.pem | ForEach-Object { .\openssl x509 -inform DER -in $_ -out "$_" }
 
#объединение всех полученных сертификатов в полную цепочку, которую можно открыть в привычном виде
Get-Content -Path .\*.pem | Set-Content .\fullchain.pem
 
#перемещение полной цепочки под новым именем в папку DONE
Get-Item .\*fullchain.pem | Move-Item -Destination "$Done_Path\[fullchain]$cert_name.pem"
 
#удаление исходных и промежуточных файлов
Get-Item *.pem | Remove-Item
Remove-Item -Path "$Cert_Path\*"

Заключение

Представленный кусок кода можно упаковать в функцию, которая на входе будет получать путь до файла конечного сертификата, а на выходе отдавать путь до готового Fullchain. Скрипт можно расширить, добавив ещё одну вводную — приватный ключ, а на выходе PFX‑контейнер. Я намерено не стал перегружать код проверками, условиями и обработкой ошибок через try\catch, поскольку хотел лишь продемонстрировать механизм получения Fullchain, но если вы собираетесь использовать этот кусок в сложной автоматизации — не забывайте про все выше перечисленное:‑)

Комментарии (4)


  1. itshnick88
    17.08.2025 23:46

    Нам обычно, при выпуске TLS сертификата на домен, присылают все участвующие сертификаты, цепочку уже из них сшиваю... там просто

    cat domain.crt intermediate.crt root.crt > fullchain.crt

    Тут как я понял вся фишка в том, что можно иметь при себе только конечный, но тут, мне кажется, минус будет в том, что если OCSP респондеры не ответят, то результата мы не получим. И Let's Encrypt как раз 6 августа их отключили


    1. ivan_moroz Автор
      17.08.2025 23:46

      Да, видел новость, что их отключают, но ещё буквально несколько дней назад - мне удавалось получить описанным выше способом полную цепочку сертификата, выпущенного через Let's Encrypt


  1. martin74ua
    17.08.2025 23:46

    Так LE сразу даёт все сертификаты, в том числе и полную цепочку.


    1. ivan_moroz Автор
      17.08.2025 23:46

      Let's Encrypt действительно, дает помимо конечного, ещё рутовый + мидл в отдельном файле. Но с коммерческими не так, насколько я мог заметить. По крайней мере нам, сертификат выпущенный через Global Sign - приходит без полной цепочки