Generera självsignerade certifikat med .NET CLI
Det finns olika sätt att skapa och använda självsignerade certifikat för utvecklings- och testscenarier. Den här artikeln beskriver hur du använder självsignerade certifikat med dotnet dev-certs
, och andra alternativ som PowerShell
och OpenSSL
.
Du kan sedan verifiera att certifikatet läses in med ett exempel, till exempel en ASP.NET Core-app som finns i en container.
Förutsättningar
För dotnet dev-certs
måste du ha rätt version av .NET installerad:
Det här exemplet kräver Docker 17.06 eller senare av Docker-klienten.
Förbereda exempelapp
I den här guiden använder du en exempelapp och gör ändringar där det är lämpligt.
Kontrollera att exempelappen Dockerfile använder .NET 8.
Beroende på värdoperativsystemet kan du behöva uppdatera ASP.NET-körningen. Om du till exempel vill rikta in dig på lämplig Windows-körning ändrar du mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime
till mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime
i Dockerfile.
Detta hjälper till exempel att testa certifikaten i Windows:
# 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"]
Om du testar certifikaten i Linux kan du använda den befintliga Dockerfile.
Kontrollera att aspnetapp.csproj
innehåller lämpligt målramverk:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<!--Other Properties-->
</PropertyGroup>
</Project>
Kommentar
Om du vill använda dotnet publish
parametrar för att trimma distributionen kontrollerar du att lämpliga beroenden ingår för stöd för SSL-certifikat.
Uppdatera filen dotnet-docker\samples\aspnetapp\aspnetapp.csproj för att säkerställa att lämpliga sammansättningar ingår i containern. Som referens kontrollerar du hur du uppdaterar .csproj-filen för att stödja SSL-certifikat när du använder trimning för fristående distributioner.
Kontrollera att du pekar på exempelappen.
cd .\dotnet-docker\samples\aspnetapp
Skapa containern för att testa lokalt.
docker build -t aspnetapp:my-sample -f Dockerfile .
Skapa ett självsignerat certifikat
Du kan skapa ett självsignerat certifikat:
Med dotnet dev-certs
Du kan använda dotnet dev-certs
för att arbeta med självsignerade certifikat.
dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p crypticpassword
dotnet dev-certs https --trust
Kommentar
Certifikatnamnet i det här fallet aspnetapp.pfx måste matcha projektets sammansättningsnamn. crypticpassword
används som stand-in för ett lösenord som du själv väljer. Om konsolen returnerar "Ett giltigt HTTPS-certifikat finns redan.", finns det redan ett betrott certifikat i ditt arkiv. Den kan exporteras med MMC-konsolen.
Konfigurera programhemligheter för certifikatet:
dotnet user-secrets -p aspnetapp\aspnetapp.csproj init
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword"
Kommentar
Obs! Lösenordet måste matcha lösenordet som används för certifikatet.
Kör containeravbildningen med ASP.NET Core konfigurerad för HTTPS:
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
När programmet startar navigerar du till https://localhost:8001
i webbläsaren.
Rensa
Om hemligheterna och certifikaten inte används måste du rensa dem.
dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean
Med PowerShell
Du kan använda PowerShell för att generera självsignerade certifikat. PKI-klienten kan användas för att generera ett självsignerat certifikat.
$cert = New-SelfSignedCertificate -DnsName @("contoso.com", "www.contoso.com") -CertStoreLocation "cert:\LocalMachine\My"
Certifikatet genereras, men i testsyfte bör det placeras i ett certifikatarkiv för testning i en webbläsare.
$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)
I det här läget bör certifikaten kunna visas från en MMC-snapin-modul.
Du kan köra exempelcontainern i Windows-undersystem för Linux (WSL):
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
Kommentar
Observera att med volymmonteringen kan filsökvägen hanteras på olika sätt baserat på värden. I WSL kan du till exempel ersätta /c/certs med /mnt/c/certs.
Om du använder containern som skapades tidigare för Windows skulle körningskommandot se ut så hä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
När programmet är igång navigerar du till contoso.com:8001 i en webbläsare.
Se till att värdposterna har uppdaterats för contoso.com
att svara på lämplig IP-adress (till exempel 127.0.0.1). Om certifikatet inte identifieras kontrollerar du att certifikatet som läses in med containern också är betrott på värden och att det finns lämpliga SAN/DNS-poster för contoso.com
.
Rensa
$cert | Remove-Item
Get-ChildItem $certKeyPath | Remove-Item
$rootCert | Remove-item
Med OpenSSL
Du kan använda OpenSSL för att skapa självsignerade certifikat. I det här exemplet används WSL/Ubuntu och ett bash-gränssnitt med OpenSSL
.
Det här kommandot genererar en .crt och en .key.
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
Använd följande kommando för att hämta en .pfx:
openssl pkcs12 -export -out $PARENT.pfx -inkey $PARENT.key -in $PARENT.crt
Kommentar
Från och med .NET 5 kan Kestrel ta .crt - och PEM-kodade .key filer utöver PFX-filer med ett lösenord.
Beroende på värdoperativsystemet måste certifikatet vara betrott. På en Linux-värd är "förtroende" för certifikatet annorlunda och distributionsberoende.
I den här guiden finns här ett exempel i Windows som använder PowerShell:
Import-Certificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root'
Kör exemplet med följande kommando i WSL:
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
Kommentar
I WSL kan volymmonteringssökvägen ändras beroende på konfigurationen.
Kör följande kommando i 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__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
När programmet är igång navigerar du till contoso.com:8001 i en webbläsare.
Se till att värdposterna har uppdaterats för contoso.com
att svara på lämplig IP-adress (till exempel 127.0.0.1). Om certifikatet inte identifieras kontrollerar du att certifikatet som läses in med containern också är betrott på värden och att det finns lämpliga SAN/DNS-poster för contoso.com
.
Rensa
Se till att rensa de självsignerade certifikaten när du är klar med testningen.
Get-ChildItem $certKeyPath | Remove-Item