.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, ile dotnet dev-certsotomatik olarak imzalanan sertifikaların ve ve gibi PowerShell OpenSSLdiğer seçeneklerin kullanılmasını 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 olarak mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime değiştirinmcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime.

Ö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>

Not

Dağıtımı kırpmak için parametreleri kullanmak dotnet publish 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. Başvuru için, bağımsız dağıtımlar için kırpmayı kullanırken SSL sertifikalarını destekleyecek şekilde .csproj dosyasının nasıl güncelleştirileceklerini denetleyin.

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

cd .\dotnet-docker\samples\aspnetapp

Kapsayıcıyı yerel olarak test etmek için derleyin.

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

Otomatik olarak imzalanan 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

Not

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

Not

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 adresine https://localhost:8001 gidin.

Temizleme

Gizli diziler ve sertifikalar kullanımda değilse, bunları temizlemeyi unutmayın.

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 bileşeninden görüntülenebilir olmalıdır.

Örnek kapsayıcıyı Linux için Windows Alt Sistemi (WSL) içinde ç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

Not

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.

Konak girişlerinin uygun IP adresinde yanıt verecek şekilde güncelleştirildiğinden contoso.com emin olun (örneğin, 127.0.0.1). Sertifika tanınmıyorsa, kapsayıcıyla yüklenen sertifikaya konakta da güvenildiğinden ve için contoso.comuygun 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 ile OpenSSLbir 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

Not

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

Konak 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

Not

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.

Konak girişlerinin uygun IP adresinde yanıt verecek şekilde güncelleştirildiğinden contoso.com emin olun (örneğin, 127.0.0.1). Sertifika tanınmıyorsa, kapsayıcıyla yüklenen sertifikaya konakta da güvenildiğinden ve için contoso.comuygun 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 bkz.