Dela via


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-certsmå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 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

Se även