.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-certs
otomatik olarak imzalanan sertifikaların ve ve gibi PowerShell
OpenSSL
diğ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-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
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.com
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 ile 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
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.com
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