.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 istemcisinin Docker 17.06 veya sonraki bir sürümünü gerektirir.

Örnek uygulamayı hazırlama

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

Örnek Dockerfile uygulamasının .NET 8 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:8.0-nanoservercore-2009 AS runtime'i mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime ile değiştirin.

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

# 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"]

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>net8.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 crypticpassword
dotnet dev-certs https --trust

Uyarı

Bu örnekte aspnetapp.pfx sertifika adı proje derleme adıyla eşleşmelidir. crypticpassword kendi seçtiğiniz bir parola için bir stand-in olarak kullanılır. Konsol "Geçerli bir HTTPS sertifikası zaten var" döndürürse, deponuzda zaten bir güvenilen sertifika var. MMC Konsolu kullanılarak dışarı aktarılabilir.

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" "crypticpassword"

Uyarı

Not: 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 'password' -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="password" -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 yolunun ana bilgisayara göre farklı şekilde işlenebileceğini unutmayın. Ö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="password" -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