.NET CLI ile otomatik olarak imzalanan sertifikalar oluşturma

Geliştirme ve test senaryoları için otomatik olarak imzalanan sertifikalar oluşturmanın ve kullanmanın farklı yolları vardır. Bu makale, dotnet dev-certs ile kendinden imzalı sertifikaların kullanımını ve PowerShell ile OpenSSL gibi diğer seçenekleri kapsar.

Daha sonra kapsayıcıda barındırılan ASP.NET Core uygulaması gibi bir örnek kullanarak sertifikanın yüklendiğini doğrulayabilirsiniz.

Önkoşullar

için dotnet dev-certsuygun .NET sürümünün yüklü olduğundan emin olun:

Bu örnek, Docker istemcisi gerektirir.

Örnek uygulamayı hazırlama

Bu kılavuz için örnek bir uygulama kullanacak ve uygun yerlerde değişiklikler yapacaksınız.

Örnek uygulamanın Dockerfile .NET 10 kullanıp kullanmadığını denetleyin.

Konak işletim sistemine bağlı olarak, ASP.NET çalışma zamanını güncelleştirmeniz gerekebilir. Örneğin, uygun Windows çalışma zamanını hedeflemek için Dockerfile içinde mcr.microsoft.com/dotnet/aspnet:10.0-nanoservercore-2009 AS runtime'i mcr.microsoft.com/dotnet/aspnet:10.0-windowsservercore-ltsc2022 AS runtime ile değiştirin.

Örneğin, bu, Windows'ta sertifikaları test etme konusunda yardımcı olur:

# https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md
FROM mcr.microsoft.com/dotnet/sdk:10.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:10.0-windowsservercore-ltsc2022 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]

Sertifikaları Linux'ta test ediyorsanız mevcut Dockerfile dosyasını kullanabilirsiniz.

öğesinin aspnetapp.csproj uygun hedef çerçeveyi içerdiğinden emin olun:

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

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

</Project>

Uyarı

Dağıtımı dotnet publish için parametrelerini kullanmak istiyorsanız, SSL sertifikalarını desteklemek için uygun bağımlılıkların eklendiğinden emin olun. Kapsayıcıya uygun derlemelerin eklendiğinden emin olmak için dotnet-docker\samples\aspnetapp\aspnetapp.csproj dosyasını güncelleştirin. Referans olması için, bağımsız dağıtımlar için trimming işlemi kullanırken SSL sertifikalarını destekleyecek şekilde .csproj dosyasını nasıl güncelleştirebileceğinizi kontrol edin.

Örnek uygulamaya işaret ettiğinizden emin olun.

cd .\dotnet-docker\samples\aspnetapp

Kapsayıcıyı yerel olarak test etmek için oluşturun.

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

Kendinden imzalı sertifika oluşturma

Otomatik olarak imzalanan bir sertifika oluşturabilirsiniz:

dotnet dev-certs ile

Otomatik olarak imzalanan sertifikalarla çalışmak için kullanabilirsiniz dotnet dev-certs .

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

Uyarı

Bu örnekte aspnetapp.pfx sertifika adı proje derleme adıyla eşleşmelidir. $CREDENTIAL_PLACEHOLDER$ kendi seçtiğiniz bir parolayı temsil eder. Konsol "Geçerli bir HTTPS sertifikası zaten var" döndürürse, deponuzda güvenilen bir sertifika zaten var olur. MMC Konsolunu kullanarak dışarı aktarabilirsiniz.

.NET 10 ve sonraki sürümlerde, Linux için Windows Alt Sistemi (WSL) örneğinde dotnet dev-certs https --trust çalıştırırsanız, komut Windows konağındaki sertifikaya da güvenir.

.NET 10 ve sonraki sürümlerde, oluşturulan sertifika host.docker.internal ve host.containers.internal için ek yapılandırma olmadan doğrudan kapsayıcı tabanlı yerel geliştirme senaryolarında sertifikayı kullanmanızı sağlayan konu alternatif adlarını (SAN) içerir.

Güvenilir bir geliştirme sertifikasının mevcut olduğunu doğrulamak için komutunu çalıştırın dotnet dev-certs https --check --trust.

Sertifika için uygulama gizli bilgilerini yapılandırın.

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

Uyarı

Parola, sertifika için kullanılan parolayla eşleşmelidir.

KAPSAYıCı görüntüsünü HTTPS için yapılandırılmış ASP.NET Core ile çalıştırın:

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

Uygulama başladıktan sonra, web tarayıcınızda https://localhost:8001 adresine gidin.

Temizleme

Gizli anahtarlar ve sertifikalar kullanımda değilse, bunları temizlediğinizden emin olun.

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

PowerShell ile

Otomatik olarak imzalanan sertifikalar oluşturmak için PowerShell'i kullanabilirsiniz. PKI İstemcisi, otomatik olarak imzalanan bir sertifika oluşturmak için kullanılabilir.

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

Sertifika oluşturulur, ancak test amacıyla tarayıcıda test için bir sertifika deposuna yerleştirilmelidir.

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

Bu noktada, sertifikalar MMC ek modülünden görüntülenebilir olmalıdır.

Örnek kapsayıcıyı Linux için Windows Alt Sistemi'nde (WSL) çalıştırabilirsiniz:

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="$CREDENTIAL_PLACEHOLDER$" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

Uyarı

Birim bağlama ile, dosya yolu konağa göre farklı şekilde işlenebilir. Örneğin, WSL'de /c/certs değerini /mnt/c/certs ile değiştirebilirsiniz.

Daha önce Windows için oluşturulan kapsayıcıyı kullanıyorsanız çalıştırma komutu aşağıdaki gibi görünür:

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="$CREDENTIAL_PLACEHOLDER$" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample

Uygulama yüklendikten sonra tarayıcıda contoso.com:8001 gidin.

contoso.com için konak girişlerinin uygun IP adresinde (örneğin, 127.0.0.1) yanıt verecek şekilde güncellendiğinden emin olun. Sertifika tanınmıyorsa, kapsayıcıyla yüklenen sertifikaya konakta da güvenildiğinden ve contoso.com için uygun SAN / DNS girdileri olduğundan emin olun.

Temizleme

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

OpenSSL ile

Otomatik olarak imzalanan sertifikalar oluşturmak için OpenSSL kullanabilirsiniz. Bu örnekte WSL / Ubuntu ve OpenSSL bir bash kabuğu kullanılır.

Bu komut bir .crt ve .key oluşturur.

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 almak için aşağıdaki komutu kullanın:

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

Uyarı

.NET 5'den başlayarak Kestrel, parolalı .pfx dosyalarına ek olarak .crt ve PEM ile kodlanmış .key dosyaları alabilir.

Ana bilgisayar işletim sistemine bağlı olarak, sertifikaya güvenilmesi gerekir. Linux ana bilgisayarında sertifikaya 'güvenmek' farklıdır ve dağıtıma bağlıdır.

Bu kılavuzun amaçları doğrultusunda Windows'ta PowerShell kullanan bir örnek aşağıda verilmiştir:

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

WSL'de aşağıdaki komutu kullanarak örneği çalıştırın:

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

Uyarı

WSL'de, birim bağlama yolu yapılandırmaya bağlı olarak değişebilir.

PowerShell'de aşağıdaki komutu çalıştırın:

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

Uygulama yüklendikten sonra tarayıcıda contoso.com:8001 gidin.

contoso.com için konak girişlerinin uygun IP adresinde (örneğin, 127.0.0.1) yanıt verecek şekilde güncellendiğinden emin olun. Sertifika tanınmıyorsa, kapsayıcıyla yüklenen sertifikaya konakta da güvenildiğinden ve contoso.com için uygun SAN / DNS girdileri olduğundan emin olun.

Temizleme

Testi tamamladıktan sonra otomatik olarak imzalanan sertifikaları temizlemeyi unutmayın.

Get-ChildItem $certKeyPath | Remove-Item

Ayrıca bakınız