Поделиться через


Запустите агент с самоподписанным сертификатом

Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

В этой статье объясняется, как запустить самостоятельно размещенный агент с самозаверяющим сертификатом для Azure Pipelines и на сервере Azure DevOps.

Работа с сертификатом SSL-сервера

Enter server URL > https://corp.tfs.com/tfs
Enter authentication type (press enter for Integrated) >
Connecting to server ...
An error occurred while sending the request.

В журнале диагностики агента показано:

[2017-11-06 20:55:33Z ERR  AgentServer] System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: A security error occurred

Предыдущая ошибка безопасности может указывать на то, что компьютер сборки не доверяет сертификату сервера, используемому на хост-компьютере Azure Devops Server. Убедитесь, что вы установите самоподписанный SSL-сертификат сервера в хранилище сертификатов ОС.

Windows: Windows certificate store
Linux: OpenSSL certificate store
macOS: OpenSSL certificate store for agent version 2.124.0 or below
       Keychain for agent version 2.125.0 or above

Вы можете легко проверить правильность установки сертификата, выполнив несколько команд. Если SSL рукопожатие успешно завершается (даже если вы получаете код 401 по запросу), установка была успешной.

Windows: PowerShell Invoke-WebRequest -Uri https://corp.tfs.com/tfs -UseDefaultCredentials 
Linux: curl -v https://corp.tfs.com/tfs 
macOS: curl -v https://corp.tfs.com/tfs (agent version 2.124.0 or below, curl needs to be built for OpenSSL)
       curl -v https://corp.tfs.com/tfs (agent version 2.125.0 or above, curl needs to be built for Secure Transport)

Если вы не можете успешно установить сертификат в хранилище сертификатов компьютера по разным причинам (например, у вас нет правильных разрешений или вы находитесь на настроенном компьютере Linux), есть еще один вариант. Агент версии 2.125.0 или выше имеет возможность игнорировать ошибку проверки сертификата SSL-сервера.

Это важно

Не рекомендуется игнорировать ошибки проверки сертификата SSL-сервера. Это не безопасно. Настоятельно рекомендуется установить сертификат в хранилище сертификатов компьютера.

Передайте --sslskipcertvalidation во время настройки агента:

./config.cmd/sh --sslskipcertvalidation

Примечание.

Чтобы использовать флаг в Linux и macOS, --sslskipcertvalidationlibcurl на компьютере Linux или macOS с помощью OpenSSL.

Проблема: команда получения исходных данных Git завершается сбоем при использовании SSL-сертификата (только для агента Windows)

Мы отправляем командную строку Git в составе агента Windows и используем эту копию Git для всех операций, связанных с Git. Если у вас есть самоподписанный SSL-сертификат для локального сервера Azure DevOps, настройте предустановленный Git так, чтобы он разрешал использование самоподписанного SSL-сертификата.

Существует два способа решения этой проблемы:

  • Задайте следующие git config параметры на глобальном уровне для пользователя, под которым работает агент.

    git config --global http."https://tfs.com/".sslCAInfo certificate.pem
    

    Примечание.

    Установка уровня git config системы не является надежной в Windows. Файл .gitconfig системы хранится вместе с копией Git, которую мы упаковали. Упакованный Git заменяется каждый раз, когда агент обновляется до новой версии.

  • Включите git для использования SChannel во время настройки при использовании агента версии 2.129.0 или более поздней версии. Укажите --gituseschannel во время настройки агента.

    ./config.cmd --gituseschannel
    

    Примечание.

    Git SChannel имеет более строгие требования для самозаверяющего сертификата. Самозаверяющий сертификат, создаваемый службами IIS или командой PowerShell, может быть несовместим с SChannel.

Работа с SSL-сертификатом клиента

IIS имеет параметр SSL, который требует, чтобы все входящие запросы к Azure DevOps Server представляли клиентский сертификат и обычные учетные данные.

Если включен параметр SSL IIS, необходимо использовать версию 2.125.0 или более позднюю и выполнить следующие дополнительные действия, чтобы настроить компьютер сборки на сервере Azure DevOps Server.

  1. Подготовьте все необходимые сведения о сертификате:

    • Сертификат центра сертификации (ЦС) в .pem формате: этот файл должен содержать открытый ключ и подпись сертификата ЦС. Необходимо поместить корневой сертификат ЦС и все промежуточные сертификаты ЦС в один .pem файл.
    • Сертификат клиента в .pem формате: этот файл должен содержать открытый ключ и подпись сертификата клиента.
    • Закрытый ключ сертификата клиента в .pem формате: этот файл должен содержать только закрытый ключ сертификата клиента.
    • Пакет архива сертификата клиента в .pfx формате: этот файл должен содержать подпись, открытый ключ и закрытый ключ сертификата клиента.
    • Пароль. Используйте тот же пароль для защиты закрытого ключа сертификата клиента и пакета архива сертификата клиента, так как у них есть закрытый ключ сертификата клиента.
  2. Установите сертификат ЦС в хранилище сертификатов компьютера:

    • Linux: хранилище сертификатов OpenSSL
    • macOS: цепочка ключей системы или пользователя
    • Windows: хранилище сертификатов Windows
  3. Передайте --sslcacert, --sslclientcert, --sslclientcertkey. --sslclientcertarchive, а также --sslclientcertpassword во время настройки агента.

    .\config.cmd/sh --sslcacert ca.pem --sslclientcert clientcert.pem --sslclientcertkey clientcert-key-pass.pem --sslclientcertarchive clientcert-archive.pfx --sslclientcertpassword "mypassword"
    

    Пароль закрытого ключа сертификата клиента безопасно хранится на каждой платформе.

    Linux: Encrypted with a symmetric key based on the machine ID
    macOS: macOS Keychain
    Windows: Windows Credential Store
    

Проверка доверия корневого центра сертификации

Агент сборки использует Node.js, который использует собственное хранилище сертификатов, которое является производным от доверенных корневых сертификатов Mozilla. Хранилище центра сертификации Node.js должно доверять любому корневому сертификату, используемому для безопасного взаимодействия. В противном случае после обновления сертификата на компьютере Azure DevOps Server могут возникнуть следующие ошибки:

  • "Не удается получить сертификат локального издателя"
  • "САМОПОДПИСАННЫЙ_СЕРТИФИКАТ_В_ЦЕПОЧКЕ"
  • "Не удается проверить первый сертификат"

Вы можете использовать массив tls.rootCertificates для проверки доверенных корневых ЦС, которые используются для проверки подключений TLS/SSL.

# Sample script to extract Node.js root certificates using Node.js.  
node -e ' 
const tls = require("tls"); 
console.log(tls.rootCertificates.join("\n")); 
' > "$ROOT_CERTS_FILE" 

Переменная NODE_EXTRA_CA_CERTS среды, представленная в Node версии 7.3.0, позволяет указать файл, содержащий один или несколько сертификатов ЦС, которым доверяет Node (в дополнение к пакету по умолчанию). NODE_EXTRA_CA_CERTS добавляется в хранилище сертификатов.

  1. На сервере или ЦС экспортируйте корневые сертификаты (и любые промежуточные, при необходимости) в виде файла с кодировкой PEM. Этот формат представляет собой текстовый файл с данными в формате Base64 и -----BEGIN CERTIFICATE-----. Убедитесь, что вы используете PEM в кодировке Base64, а не DER. (В Windows файлы .cer можно переименовать в .pem, чтобы избежать путаницы. Файл может иметь любое расширение, но .pem или .crt является стандартным.)

    Если у вас несколько внутренних ЦС (цепочка), их можно объединить в один файл. Узел считывает все сертификаты в этом файле.

  2. Сделайте PEM доступным в агенте сборки, поместив его в известный путь (например, C:\certs\CorpRootCA.pem or /etc/ssl/certs/CorpRootCA.pem).

  3. Задайте переменную среды ОС, NODE_EXTRA_CA_CERTSкоторая указывает на PEM-файл. Например, powerShell можно использовать в Windows:

[Environment]::SetEnvironmentVariable("NODE_EXTRA_CA_CERTS", "C:\certs\CorpRootCA.pem", "Machine")

Дополнительные сведения о поддержке сертификата клиента агента см. в.