.NET CLı ile otomatik olarak imzalanan sertifikalar oluşturma

Otomatik olarak imzalanan sertifikalar kullanılırken geliştirme ve test senaryolarında bunları oluşturmanın ve kullanmanın farklı yolları vardır. Bu kılavuzda, ile otomatik olarak imzalanan sertifikaları dotnet dev-certs ve ve gibi diğer seçenekleri kullanarak kapsayabileceksiniz PowerShell OpenSSL .

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

Önkoşullar

Örnekte, .NET Core 3,1 veya .NET 5 ' i kullanabilirsiniz.

İçin dotnet dev-certs , uygun .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

Test için kullanmak istediğiniz çalışma zamanına bağlı olarak, .NET Core 3,1 veya .NET 5gibi örnek uygulamayı hazırlamanız gerekir.

Bu kılavuzda, örnek bir uygulama kullanacaksınız ve uygun yerlerde değişiklik yapacaksınız.

.NET Core 3,1 örnek uygulama

Örnek uygulamayı alma.

git clone https://github.com/dotnet/dotnet-docker/

Depoya yerel olarak gidin ve çalışma alanını bir düzenleyicide açın.

Not

Dağıtımı kırpmak için DotNet Publish parametrelerini kullanmak ISTIYORSANıZ, SSL sertifikalarını desteklemek için uygun bağımlılıkların eklendiğinden emin olun. Uygun derlemelerin kapsayıcıya eklendiğinden emin olmak için DotNet-docker\samples\aspnetapp\aspnetapp.csproj 'i güncelleştirin. Başvuru için,. csproj dosyasını, kendi içinde olan dağıtımlar için kırpma kullanılırken SSL sertifikalarını destekleyecek şekilde güncelleştirmeyi denetleyin.

' Nin aspnetapp.csproj uygun hedef Framework 'ü içerdiğinden emin olun:

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

  <PropertyGroup>
    <TargetFramework>.netcoreapp3.1</TargetFramework>
    <!--Other Properties-->
  </PropertyGroup>

</Project>

Çalışma zamanının .NET Core 3,1 ' e işaret ettiğini doğrulamak için Dockerfile 'ı değiştirin:

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

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

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

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

cd .\dotnet-docker\samples\aspnetapp

Test için kapsayıcıyı yerel olarak oluşturun.

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

.NET 5 örnek uygulama

Bu kılavuzda, örnek aspnetapp .NET 5 için denetlenmelidir.

Örnek uygulama Dockerfile 'ın .NET 5 kullandığını denetleyin.

konak işletim sistemine bağlı olarak, ASP.NET çalışma zamanının güncellenmesi gerekebilir. örneğin, mcr.microsoft.com/dotnet/aspnet:5.0-nanoservercore-2009 AS runtime mcr.microsoft.com/dotnet/aspnet:5.0-windowsservercore-ltsc2019 AS runtime dockerfile içinde olarak değiştirme, uygun Windows çalışma zamanını hedeflemeye yardımcı olur.

Örneğin, bu Windows sertifikaların test edilmesine yardımcı olur:

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.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
# Uses the 2009 release; 2004, 1909, and 1809 are other choices
FROM mcr.microsoft.com/dotnet/aspnet:5.0-windowsservercore-ltsc2019 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]

Linux 'ta sertifikaları test etmemiz durumunda mevcut Dockerfile 'ı kullanabilirsiniz.

' Nin aspnetapp.csproj uygun hedef Framework 'ü içerdiğinden emin olun:

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

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

</Project>

Not

dotnet publishDağıtımı kırpmak için parametreleri kullanmak istiyorsanız, SSL sertifikalarını desteklemek için uygun bağımlılıkların eklendiğinden emin olun. Uygun derlemelerin kapsayıcıya eklendiğinden emin olmak için DotNet-docker\samples\aspnetapp\aspnetapp.csproj 'i güncelleştirin. Başvuru için,. csproj dosyasını, kendi içinde olan dağıtımlar için kırpma kullanılırken SSL sertifikalarını destekleyecek şekilde güncelleştirmeyi denetleyin.

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

cd .\dotnet-docker\samples\aspnetapp

Test için kapsayıcıyı yerel olarak oluşturun.

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

Otomatik olarak imzalanan sertifika oluşturma

Kendinden imzalı bir sertifika oluşturabilirsiniz:

DotNet dev-CERT ile

dotnet dev-certsOtomatik olarak imzalanan sertifikalarla çalışmak için ' i kullanabilirsiniz.

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

Not

Bu durumda, sertifika adı aspnetapp. pfx proje derleme adıyla eşleşmelidir. crypticpassword , kendi seçtiğiniz bir parola için bir bağımsız olarak kullanılır. Konsol "geçerli bir HTTPS sertifikası zaten var." ise, deponuzda bir güvenilen sertifika zaten var. Bu, MMC konsolu kullanılarak aktarılabilir.

Sertifika için uygulama gizli dizilerini yapılandırın:

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

Not

Note: parolanın, sertifika için kullanılan parolayla eşleşmesi gerekir.

kapsayıcı görüntüsünü HTTPS için yapılandırılan ASP.NET Core ç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 sayfasına gidin https://localhost:8001 .

Temizleme

Gizlilikler 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 istemcisi , kendinden imzalı bir sertifika oluşturmak için kullanılabilir.

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

Sertifika oluşturulacaktır, ancak test amaçları doğrultusunda bir 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ın bir MMC ek bileşenindengörüntülenebilir olması gerekir.

örnek kapsayıcıyı Linux için Windows Alt Sistemi (wsl) ' de ç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 konağa göre farklı işlenebileceğini unutmayın. Örneğin, WSL 'de /c/CERT ' yi /mnt/c/CERT ile değiştirebilir.

daha önce Windows için oluşturulmuş kapsayıcıyı kullanıyorsanız, çalıştır 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 kurulduktan sonra tarayıcıda contoso.com:8001 adresine gidin.

Konak girdilerinin contoso.com uygun IP adresinde (örneğin, 127.0.0.1) yanıt verecek şekilde güncelleştirildiğinden emin olun. Sertifika tanınmazsa, kapsayıcınıza yüklenmiş sertifikaya da konakta güvenildiğinden ve için uygun SAN/DNS girişleri olduğundan emin olun contoso.com .

Temizleme

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

OpenSSL ile

Otomatik olarak imzalanan sertifikalar oluşturmak için OpenSSL kullanabilirsiniz. Bu örnek, ile WSL/Ubuntu ve Bash kabuğunu kullanır OpenSSL .

Bu, bir. CRT ve bir. anahtarı 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

. Aspnetcore 3,1 örneği, .pfx ve parolasını kullanacaktır. .net 5Çalışma zamanından Itibaren Kestrel, ayrıca .crt ped kodlu dosyaları da alabilir .key .

Ana bilgisayar işletim sistemine bağlı olarak, sertifikanın güvenilir olması gerekir. Bir Linux konağında, ' güvenme ' sertifikası farklıdır ve bu sertifikaya bağımlıdır.

bu kılavuzun amaçları doğrultusunda, PowerShell kullanarak Windows bir örnek aşağıda verilmiştir:

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

.NET Core 3,1 için, WSL 'de şu 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__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/path/to/certs/:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

.NET 5 ' den başlayarak, Kestrel .crt ve pek kodlu .key dosyaları alabilir. .NET 5 için aşağıdaki komutla örneği ç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__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 yolunun yapılandırmaya bağlı olarak değişebileceğini unutmayın.

Windows .net Core 3,1 için ' de aşağıdaki komutu çalıştırın 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__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample

Windows 'de .net 5 için 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 kurulduktan sonra tarayıcıda contoso.com:8001 adresine gidin.

Konak girdilerinin contoso.com uygun IP adresinde (örneğin, 127.0.0.1) yanıt verecek şekilde güncelleştirildiğinden emin olun. Sertifika tanınmazsa, kapsayıcınıza yüklenmiş sertifikaya da konakta güvenildiğinden ve için uygun SAN/DNS girişleri olduğundan emin olun contoso.com .

Temizleme

Testi tamamladıktan sonra otomatik olarak imzalanan sertifikaları temizlediğinizden emin olun.

Get-ChildItem $certFilePath | Remove-Item