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


Использование прокси-сервера разработки с приложениями .NET, работающими в Docker

Если вы запускаете приложение .NET в контейнере Docker и хотите использовать прокси-сервер разработки, необходимо выполнить несколько шагов, чтобы сделать его работой.

Настройка прокси-сервера для контейнера Docker

Так как приложение .NET выполняется внутри контейнера Docker и прокси-сервер разработки выполняется на узле, необходимо настроить прокси-сервер для указания IP-адреса компьютера (http://192.0.2.13 в следующем примере). .NET использует HTTPS_PROXY переменную среды для настройки прокси-сервера для своего HTTP-клиента. Чтобы настроить переменную для контейнера Docker, используйте --env, -e этот параметр при запуске контейнера:

docker run --rm -it -v $(pwd):/usr/src/app -e HTTPS_PROXY=http://192.0.2.13:8000 mcr.microsoft.com/dotnet/sdk:8.0 bash

Внимание

При использовании прокси-сервера разработки в macOS необходимо подключить его к 0.0.0.0 адресу, чтобы сделать его доступным из контейнера Docker. Чтобы настроить IP-адрес для прокси-сервера разработки, запустите его с помощью следующей команды:

devproxy --ip-address 0.0.0.0

Внимание

При использовании прокси-сервера разработки в Linux необходимо подключить его к 0.0.0.0 адресу, чтобы сделать его доступным из контейнера Docker. Чтобы настроить IP-адрес для прокси-сервера разработки, запустите его с помощью следующей команды:

devproxy --ip-address 0.0.0.0

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

Для проверки трафика HTTPS, перехватаемого из приложения, используется собственный SSL-сертификат. При установке прокси-сервера разработки на компьютере он создает самозаверяющий SSL-сертификат и добавляет его в список доверенных сертификатов. Однако при запуске приложения в контейнере Docker контейнер не имеет доступа к SSL-сертификату, установленному на компьютере. Существует два способа обработки SSL-сертификатов при использовании прокси-сервера разработки с приложениями .NET, работающими в контейнерах Docker.

Настройка сертификата прокси-сервера разработки в контейнере Docker

Чтобы разрешить прокси-серверу разработки проверять HTTPS-запросы, можно настроить SSL-сертификат Прокси-сервера разработки как доверенный в контейнере Docker.

Внимание

Так как Docker не сохраняет изменения в контейнере после закрытия контейнера, необходимо повторять эти действия при каждом запуске контейнера. Чтобы избежать этого, создайте пользовательский образ Docker со следующими шагами.

Сначала экспортируйте сертификат прокси-сервера разработки в PEM.

Чтобы экспортировать сертификат прокси-сервера разработки в PEM в Windows, вам потребуется openssl. В этом примере предполагается, что вы используете openssl это вместе, git но его также можно установить отдельно.

Настройте каталог установки прокси-сервера разработки и git и выполните следующий сценарий в PowerShell.

$proxyPath = "C:\apps\devproxy"
$gitPath = "C:\Program Files\Git"

# convert Dev Proxy root certificate to PEM
$executable = "${gitPath}\usr\bin\openssl.exe"
$arguments = 'pkcs12 -in "{0}\rootCert.pfx" -out "{0}\rootCert.crt" -nodes' -f $proxyPath
Start-Process -FilePath $executable -ArgumentList $arguments -NoNewWindow -Wait

# Read PEM contents
$content = Get-Content "$proxyPath\rootCert.crt"

# Find the indices of the begin and end certificate lines
$beginIndex = $content.IndexOf("-----BEGIN CERTIFICATE-----")
$endIndex = $content.IndexOf("-----END CERTIFICATE-----")

# If both lines are found
if ($beginIndex -ne -1 -and $endIndex -ne -1) {
    # Trim the content to only include the certificate
    $content = $content[$beginIndex..$endIndex]
}

# Write the updated content back to the file
$content | Out-File "$proxyPath\dev-proxy-ca.crt"

При появлении запроса на ввод пароля нажмите клавишу ВВОД , не вводя ничего.

# export Dev Proxy certificate
security find-certificate -c "Dev Proxy CA" -a -p > dev-proxy-ca.pem
# rename to .crt
mv dev-proxy-ca.pem dev-proxy-ca.crt
# export Dev Proxy certificate
openssl pkcs12 -in ~/.config/dev-proxy/rootCert.pfx -clcerts -nokeys -out dev-proxy-ca.crt -passin pass:""
# rename to .crt
mv dev-proxy-ca.pem dev-proxy-ca.crt

Затем скопируйте сертификат в контейнер Docker. Самый простой способ скопировать сертификат — скопировать его в папку проекта, которая подключается к контейнеру.

Затем в контейнере Docker доверяйте сертификату. Если вы используете mcr.microsoft.com/dotnet/sdk изображение, можно использовать следующие команды:

# change to the directory where your application is located
cd /usr/app/src
# copy the certificate to the trusted certificates directory
cp dev-proxy-ca.crt /usr/local/share/ca-certificates
# update the trusted certificates
update-ca-certificates

Игнорировать проверку SSL-сертификата в приложении .NET

Другой способ обработки SSL-сертификатов при использовании прокси-сервера разработки с приложениями .NET, работающими в контейнерах Docker, заключается в том, чтобы игнорировать проверку SSL-сертификата в приложении. Этот подход требует изменения кода приложения.

В приложении добавьте следующий код, чтобы игнорировать проверку SSL-сертификата:

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;

Внимание

Перед развертыванием приложения в рабочей среде обязательно удалите этот код.