Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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>
Anmärkning
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 utvecklingscertifikat
- Med PowerShell
- Med OpenSSL
Utifrån 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
Anmärkning
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"
Anmärkning
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.
Städa upp
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 ses från en MMC-snapin.
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
Anmärkning
Observera att med volymmontering kan filsökvägen hanteras på olika sätt beroende på värddator. 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 att contoso.com
ska kunna svara på den lämpliga IP-adressen (till exempel 127.0.0.1). Om certifikatet inte erkänns kontrollerar du att certifikatet som är laddat med containern också är betrott på värddatorn och att det finns lämpliga SAN/DNS-poster för contoso.com
.
Städa upp
$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
Anmärkning
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 betrodd. På en Linux-värd skiljer sig godkännandet av certifikatet beroende på distribution.
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
Anmärkning
I WSL kan sökvägen för volymmontering ä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 att contoso.com
ska kunna svara på den lämpliga IP-adressen (till exempel 127.0.0.1). Om certifikatet inte erkänns kontrollerar du att certifikatet som är laddat med containern också är betrott på värddatorn och att det finns lämpliga SAN/DNS-poster för contoso.com
.
Städa upp
Se till att rensa de självsignerade certifikaten när du är klar med testningen.
Get-ChildItem $certKeyPath | Remove-Item