Delen via


Zelfondertekende certificaten genereren met de .NET CLI

Er zijn verschillende manieren om zelfondertekende certificaten te maken en te gebruiken voor ontwikkelings- en testscenario's. Dit artikel bevat informatie over het gebruik van zelfondertekende certificaten met dotnet dev-certsen andere opties, zoals PowerShell en OpenSSL.

Vervolgens kunt u valideren dat het certificaat wordt geladen met behulp van een voorbeeld zoals een ASP.NET Core-app die wordt gehost in een container.

Vereiste voorwaarden

Zorg dotnet dev-certservoor dat de juiste versie van .NET is geĆÆnstalleerd:

Voor dit voorbeeld is Docker 17.06 of hoger van de Docker-clientvereist.

Voorbeeld-app voorbereiden

Voor deze handleiding gebruikt u een voorbeeld-app en kunt u waar nodig wijzigingen aanbrengen.

Controleer of de Dockerfile-voorbeeld-app .NET 8 gebruikt.

Afhankelijk van het host-besturingssysteem moet u mogelijk de ASP.NET runtime bijwerken. Als u zich bijvoorbeeld wilt richten op de juiste Windows-runtime, wijzigt u mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime naar mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime in de Dockerfile.

Dit helpt bijvoorbeeld bij het testen van de certificaten in 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"]

Als u de certificaten in Linux test, kunt u het bestaande Dockerfile gebruiken.

Zorg ervoor dat het aspnetapp.csproj juiste doelframework bevat:

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

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

</Project>

Opmerking

Als u parameters wilt gebruiken dotnet publish om de implementatie te beperken , moet u ervoor zorgen dat de juiste afhankelijkheden zijn opgenomen voor het ondersteunen van SSL-certificaten. Werk het bestand dotnet-docker\samples\aspnetapp\aspnetapp.csproj bij om ervoor te zorgen dat de juiste assembly's zijn opgenomen in de container. Raadpleeg ter referentie hoe u het .csproj-bestand bijwerkt om SSL-certificaten te ondersteunen bij het gebruik van bijsnijden voor zelfstandige implementaties.

Zorg ervoor dat u verwijst naar de voorbeeld-app.

cd .\dotnet-docker\samples\aspnetapp

Bouw de container voor lokaal testen.

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

Een zelfondertekend certificaat maken

U kunt een zelfondertekend certificaat maken:

Gebruik dotnet dev-certs

U kunt gebruiken dotnet dev-certs om te werken met zelfondertekende certificaten.

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

Opmerking

De certificaatnaam moet in dit geval aspnetapp.pfx overeenkomen met de naam van de projectassembly. crypticpassword wordt gebruikt als een standaard voor een wachtwoord van uw eigen keuze. Als de console de melding "Er is al een geldig HTTPS-certificaat aanwezig." retourneert, bestaat er al een vertrouwd certificaat in uw certificaatarchief. Het kan worden geƫxporteerd met mmc-console.

Configureer toepassingsgeheimen voor het certificaat:

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

Opmerking

Opmerking: het wachtwoord moet overeenkomen met het wachtwoord dat voor het certificaat wordt gebruikt.

Draai de containerimage met ASP.NET Core geconfigureerd voor 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

Zodra de toepassing is gestart, gaat u in uw webbrowser naar https://localhost:8001.

Schoonmaken

Als de geheimen en certificaten niet worden gebruikt, zorg dat u ze verwijdert.

dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean

Met PowerShell

U kunt PowerShell gebruiken om zelfondertekende certificaten te genereren. De PKI-client kan worden gebruikt om een zelfondertekend certificaat te genereren.

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

Het certificaat wordt gegenereerd, maar voor testdoeleinden moet het in een certificaatarchief worden geplaatst om in een browser te testen.

$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)

Op dit moment moeten de certificaten zichtbaar zijn vanuit een MMC-invoegtoepassing.

U kunt de voorbeeldcontainer uitvoeren in het Windows-subsysteem voor 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

Opmerking

Houd er rekening mee dat bij het koppelen van volumes het bestandspad anders kan worden verwerkt afhankelijk van het host-systeem. In WSL kunt u bijvoorbeeld /c/certs vervangen door /mnt/c/certs.

Als u de container gebruikt die eerder is gebouwd voor Windows, ziet de opdracht uitvoeren er als volgt uit:

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

Zodra de toepassing is geopend, gaat u naar contoso.com:8001 in een browser.

Zorg ervoor dat de hostvermeldingen worden bijgewerkt om contoso.com te beantwoorden op het juiste IP-adres (bijvoorbeeld 127.0.0.1). Als het certificaat niet wordt herkend, controleert u of het certificaat dat is geladen met de container ook wordt vertrouwd op de host en of er de juiste SAN-/DNS-vermeldingen voor contoso.comzijn.

Schoonmaken

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

Met OpenSSL

U kunt OpenSSL gebruiken om zelfondertekende certificaten te maken. In dit voorbeeld wordt WSL/Ubuntu en een bash-shell gebruikt met OpenSSL.

Met deze opdracht wordt een .crt en een .key gegenereerd.

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

Gebruik de volgende opdracht om een PFX-bestand op te halen:

openssl pkcs12 -export -out $PARENT.pfx -inkey $PARENT.key -in $PARENT.crt

Opmerking

Vanaf .NET 5 kan Kestrel naast PFX-bestanden met een wachtwoord ook .crt- en PEM-gecodeerde .key-bestanden maken.

Afhankelijk van het besturingssysteem van de host moet het certificaat vertrouwd worden. Op een Linux-host is 'vertrouwen' van het certificaat anders en distributieafhankelijk.

Voor de doeleinden van deze handleiding ziet u een voorbeeld in Windows met behulp van PowerShell:

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

Voer het voorbeeld uit met behulp van de volgende opdracht in 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

Opmerking

In WSL kan het pad voor volumekoppeling veranderen, afhankelijk van de configuratie.

Voer de volgende opdracht uit in 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

Zodra de toepassing is geopend, gaat u naar contoso.com:8001 in een browser.

Zorg ervoor dat de hostvermeldingen worden bijgewerkt om contoso.com te beantwoorden op het juiste IP-adres (bijvoorbeeld 127.0.0.1). Als het certificaat niet wordt herkend, controleert u of het certificaat dat is geladen met de container ook wordt vertrouwd op de host en of er de juiste SAN-/DNS-vermeldingen voor contoso.comzijn.

Schoonmaken

Zorg ervoor dat u de zelfondertekende certificaten opschoont nadat u klaar bent met testen.

Get-ChildItem $certKeyPath | Remove-Item

Zie ook