.NET CLI を使用して自己署名証明書を生成する

自己署名証明書を作成し、開発やテストのシナリオに使用するには、さまざまな方法があります。 この記事では、dotnet dev-certs、および PowerShellOpenSSL などのその他のオプションでの自己署名証明書の使用について説明します。

次に、コンテナーでホストされている ASP.NET Core アプリなどの例を使用して、証明書が読み込まれることを検証できます。

前提条件

dotnet dev-certs については、必ず適切なバージョンの .NET をインストールしてください。

このサンプルには、Docker 17.06 以降の Docker クライアントが必要です。

サンプル アプリを準備する

このガイドでは、サンプル アプリを使用し、必要に応じて変更を加えます。

サンプル アプリ の Dockerfile で .NET 8 が使用されていることを確認します。

ホスト OS によっては、ASP.NET ランタイムの更新が必要になる場合があります。 たとえば、適切な Windows ランタイムをターゲットにするには、Dockerfile で mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtimemcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime に変更します。

たとえば、以下は、Windows で証明書をテストするのに役立ちます。

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore -r win-x64

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app -r win-x64 --self-contained false --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]

Linux で証明書をテストする場合は、既存の Dockerfile を使用できます。

aspnetapp.csproj に適切なターゲット フレームワークが含まれていることを確認します。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <!--Other Properties-->
  </PropertyGroup>

</Project>

Note

dotnet publish パラメーターを使用して展開を "トリミング" する場合は、SSL 証明書をサポートするために適した依存関係が含まれていることを確認します。 dotnet-docker\samples\aspnetapp\aspnetapp.csproj ファイルを更新して、適切なアセンブリがコンテナーに確実に含まれるようにします。 参考のために、自己完結型の展開にトリミングを使用する場合に SSL 証明書をサポートするための .csproj ファイルの更新方法を確認してください。

サンプル アプリを指していることを確認します。

cd .\dotnet-docker\samples\aspnetapp

ローカルで、テスト用のコンテナーをビルドします。

docker build -t aspnetapp:my-sample -f Dockerfile .

自己署名証明書の作成

自己署名証明書を作成できます。

dotnet dev-certs を使用する

dotnet dev-certs を使用して、自己署名証明書を操作できます。

dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p crypticpassword
dotnet dev-certs https --trust

注意

証明書名 (この場合は aspnetapp.pfx) は、プロジェクトのアセンブリ名と一致する必要があります。 crypticpassword は、自身で選択したパスワードの代わりに使用されます。 コンソールから "有効な HTTPS 証明書が既にあります。" が返された場合、信頼できる証明書がストア内に既に存在します。 MMC コンソールを使用して、これをエクスポートできます。

証明書のアプリケーション シークレットを構成します。

dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword"

注意

メモ:パスワードは、証明書に使用されているパスワードと一致する必要があります。

HTTPS 用に構成された ASP.NET Core を使用してコンテナー イメージを実行します。

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v $env:APPDATA\microsoft\UserSecrets\:C:\Users\ContainerUser\AppData\Roaming\microsoft\UserSecrets -v $env:USERPROFILE\.aspnet\https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https mcr.microsoft.com/dotnet/samples:aspnetapp

アプリケーションが起動したら、Web ブラウザーで https://localhost:8001 に移動します。

クリーンアップ

シークレットと証明書を使用しない場合は、それらを必ずクリーンアップしてください。

dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean

PowerShell の場合

PowerShell を使用して自己署名証明書を生成できます。 自己署名証明書を生成するには、PKI クライアントを使用できます。

$cert = New-SelfSignedCertificate -DnsName @("contoso.com", "www.contoso.com") -CertStoreLocation "cert:\LocalMachine\My"

証明書は生成されますが、テストの目的で、ブラウザーでテストするために証明書ストアに配置する必要があります。

$certKeyPath = "c:\certs\contoso.com.pfx"
$password = ConvertTo-SecureString 'password' -AsPlainText -Force
$cert | Export-PfxCertificate -FilePath $certKeyPath -Password $password
$rootCert = $(Import-PfxCertificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root' -Password $password)

この時点で、証明書は、MMC スナップインから表示できるようになります。

サンプル コンテナーは、Linux 用 Windows サブシステム (WSL) で実行できます。

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

Note

ボリューム マウントでは、ファイル パスの処理方法がホストによって異なる可能性があることにご注意ください。 たとえば、WSL では、/c/certs/mnt/c/certs に置き換えることができます。

以前に Windows 用に構築されたコンテナーを使用している場合、run コマンドは次のようになります。

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample

アプリケーションが起動したら、ブラウザーで contoso.com:8001 に移動します。

適切な IP アドレス (たとえば、127.0.0.1) で応答するために、ホスト エントリが contoso.com 用に更新されていることを確認してください。 証明書が認識されない場合は、コンテナーと共に読み込まれる証明書もホストで信頼されていること、および contoso.com に適した SAN および DNS エントリがあることを確認してください。

クリーンアップ

$cert | Remove-Item
Get-ChildItem $certKeyPath | Remove-Item
$rootCert | Remove-item

OpenSSL を使用する

OpenSSL を使用して自己署名証明書を作成できます。 この例では、WSL および Ubuntu と、OpenSSLを使用する bash シェルを使用します。

このコマンドは、.crt と .key を生成します。

PARENT="contoso.com"
openssl req \
-x509 \
-newkey rsa:4096 \
-sha256 \
-days 365 \
-nodes \
-keyout $PARENT.key \
-out $PARENT.crt \
-subj "/CN=${PARENT}" \
-extensions v3_ca \
-extensions v3_req \
-config <( \
  echo '[req]'; \
  echo 'default_bits= 4096'; \
  echo 'distinguished_name=req'; \
  echo 'x509_extension = v3_ca'; \
  echo 'req_extensions = v3_req'; \
  echo '[v3_req]'; \
  echo 'basicConstraints = CA:FALSE'; \
  echo 'keyUsage = nonRepudiation, digitalSignature, keyEncipherment'; \
  echo 'subjectAltName = @alt_names'; \
  echo '[ alt_names ]'; \
  echo "DNS.1 = www.${PARENT}"; \
  echo "DNS.2 = ${PARENT}"; \
  echo '[ v3_ca ]'; \
  echo 'subjectKeyIdentifier=hash'; \
  echo 'authorityKeyIdentifier=keyid:always,issuer'; \
  echo 'basicConstraints = critical, CA:TRUE, pathlen:0'; \
  echo 'keyUsage = critical, cRLSign, keyCertSign'; \
  echo 'extendedKeyUsage = serverAuth, clientAuth')

openssl x509 -noout -text -in $PARENT.crt

.pfx を取得するには、次のコマンドを使用します。

openssl pkcs12 -export -out $PARENT.pfx -inkey $PARENT.key -in $PARENT.crt

Note

.NET 5 以降、Kestrel では、パスワード月の .pfx ファイルだけでなく、.crt ファイルと PEM でエンコードされた .key ファイル を取得できます。

ホスト OS によっては、証明書を信頼できことが必要な場合があります。 Linux ホストでは、証明書を '信頼する' 方法が異なり、ディストリビューションに依存します。

このガイドの目的のために、PowerShell を使用した Windows の例を次に示します。

Import-Certificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root'

WSL で次のコマンドを使用してサンプルを実行します。

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.crt -e ASPNETCORE_Kestrel__Certificates__Default__KeyPath=/https/contoso.com.key -v /c/path/to/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

Note

WSL では、ボリューム マウントのパスが構成によって変わる場合があることにご注意ください。

PowerShell で次のコマンドを実行します。

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.crt -e ASPNETCORE_Kestrel__Certificates__Default__KeyPath=c:\https\contoso.com.key -v c:\certs:C:\https aspnetapp:my-sample

アプリケーションが起動したら、ブラウザーで contoso.com:8001 に移動します。

適切な IP アドレス (たとえば、127.0.0.1) で応答するために、ホスト エントリが contoso.com 用に更新されていることを確認してください。 証明書が認識されない場合は、コンテナーと共に読み込まれる証明書もホストで信頼されていること、および contoso.com に適した SAN および DNS エントリがあることを確認してください。

クリーンアップ

テストが完了したら、必ず自己署名証明書をクリーンアップしてください。

Get-ChildItem $certKeyPath | Remove-Item

こちらもご覧ください