Share 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.

Vereisten

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-client vereist.

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 mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime u in mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime het 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>

Notitie

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:

Met 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

Notitie

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 in de console een geldig HTTPS-certificaat wordt geretourneerd dat al aanwezig is, bestaat er al een vertrouwd certificaat in uw archief. Het kan worden geëxporteerd met mmc-console.

Configureer toepassingsgeheimen voor het certificaat:

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

Notitie

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

Voer de containerinstallatiekopieën uit 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 naar https://localhost:8001 uw webbrowser.

Opschonen

Als de geheimen en certificaten niet in gebruik zijn, moet u deze opschonen.

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 certificaatarchief in een browser worden geplaatst.

$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-module.

U kunt de voorbeeldcontainer uitvoeren in 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

Notitie

Houd er rekening mee dat met de volumekoppeling het bestandspad anders kan worden verwerkt op basis van de host. 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.

Opschonen

$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

Notitie

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

Afhankelijk van het host-besturingssysteem moet het certificaat worden vertrouwd. 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

Notitie

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.

Opschonen

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

Get-ChildItem $certKeyPath | Remove-Item

Zie ook