Docker で実行されている .NET アプリケーションで開発プロキシを使用する
Docker コンテナーで .NET アプリケーションを実行し、開発プロキシを使用する場合は、いくつかの手順に従って動作させる必要があります。
Docker コンテナーのプロキシを構成する
.NET アプリは Docker コンテナー内で実行されており、開発プロキシはホスト上で実行されているため、(次の例の) コンピューターhttp://192.0.2.13
の IP アドレスを指すようにプロキシを構成する必要があります。 .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 で開発プロキシを使用する場合は、Docker コンテナーからアクセスできるようにアドレスにアタッチ 0.0.0.0
する必要があります。 開発プロキシの IP アドレスを構成するには、次のコマンドで開始します。
devproxy --ip-address 0.0.0.0
重要
Linux で開発プロキシを使用する場合は、Docker コンテナーからアクセスできるようにアドレスにアタッチ 0.0.0.0
する必要があります。 開発プロキシの IP アドレスを構成するには、次のコマンドで開始します。
devproxy --ip-address 0.0.0.0
SSL 証明書の処理
開発プロキシは、独自の SSL 証明書を使用して、アプリケーションから傍受された HTTPS トラフィックを検査します。 コンピューターに開発プロキシをインストールすると、自己署名 SSL 証明書が生成され、信頼できる証明書の一覧に追加されます。 ただし、Docker コンテナーでアプリケーションを実行する場合、コンテナーはコンピューターにインストールされている SSL 証明書にアクセスできません。 Docker コンテナーで実行されている .NET アプリケーションで開発プロキシを使用する場合、SSL 証明書を処理する方法は 2 つあります。
Docker コンテナーで開発プロキシ証明書を構成する
開発プロキシが HTTPS 要求を検査できるようにするには、開発プロキシ SSL 証明書を Docker コンテナーで信頼済みとして構成できます。
重要
Docker はコンテナーを閉じた後も変更を保持しないため、コンテナーを起動するたびにこれらの手順を繰り返す必要があります。 これを回避するには、次の手順を含むカスタム Docker イメージを作成します。
まず、開発プロキシ証明書を PEM にエクスポートします。
Windows 上の PEM に開発プロキシ証明書をエクスポートするには、次のものが必要 openssl
です。 この例では、一緒git
に提供されているものを使用openssl
することを前提としていますが、個別にインストールすることもできます。
開発プロキシと 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"
パスワードの入力を求められたら、何も入力せずに Enter キーを押します。
# 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
.NET アプリケーションでの SSL 証明書の検証を無視する
Docker コンテナーで実行されている .NET アプリケーションで開発プロキシを使用するときに SSL 証明書を処理するもう 1 つの方法は、アプリケーションで SSL 証明書の検証を無視することです。 この方法では、アプリケーション コードを変更する必要があります。
アプリケーションで、SSL 証明書の検証を無視する次のコードを追加します。
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
注意事項
運用環境にアプリケーションをデプロイする前に、必ずこのコードを削除してください。
Dev Proxy