Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Existují různé způsoby vytváření a používání certifikátů podepsaných svým držitelem pro scénáře vývoje a testování. Tento článek se zabývá používáním certifikátů podepsaných samotným vydavatelem s dotnet dev-certs
a dalšími možnostmi jako PowerShell
a OpenSSL
.
Potom můžete ověřit, že se certifikát načte pomocí příkladu, jako je aplikace ASP.NET Core hostovaná v kontejneru.
Požadavky
Pro dotnet dev-certs
se ujistěte, že máte nainstalovanou odpovídající verzi rozhraní .NET.
Tato ukázka vyžaduje Docker 17.06 nebo novější klienta Dockeru.
Příprava ukázkové aplikace
V tomto průvodci použijete ukázkovou aplikaci a provedete změny tam, kde je to vhodné.
Zkontrolujte, jestli ukázková aplikace Dockerfile používá .NET 8.
V závislosti na hostitelském operačním systému možná budete muset aktualizovat modul runtime ASP.NET. Pokud chcete například cílit na příslušný modul runtime Windows, změňte mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime
na mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime
v souboru Dockerfile.
Pomůže vám to například s testováním certifikátů ve 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"]
Pokud testujete certifikáty v Linuxu, můžete použít existující soubor Dockerfile.
Ujistěte se, že aspnetapp.csproj
obsahuje odpovídající cílový framework.
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<!--Other Properties-->
</PropertyGroup>
</Project>
Poznámka:
Pokud chcete parametry dotnet publish
použít k oříznutí nasazení, ujistěte se, že jsou zahrnuty příslušné závislosti pro podporu SSL certifikátů. Aktualizujte soubor dotnet-docker\samples\aspnetapp\aspnetapp.csproj , aby se zajistilo, že jsou v kontejneru zahrnutá příslušná sestavení. Pro informaci se podívejte, jak aktualizovat soubor .csproj tak, aby podporoval certifikáty SSL při použití trimmování pro samostatná nasazení.
Ujistěte se, že ukazujete na ukázkovou aplikaci.
cd .\dotnet-docker\samples\aspnetapp
Sestavte kontejner pro místní testování.
docker build -t aspnetapp:my-sample -f Dockerfile .
Vytvoření vlastnoručně podepsaného certifikátu
Můžete vytvořit certifikát podepsaný svým držitelem:
S certifikáty Dotnet Dev-Certs
Můžete použít dotnet dev-certs
k práci s certifikáty podepsanými svým držitelem.
dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p crypticpassword
dotnet dev-certs https --trust
Poznámka:
Název certifikátu, v tomto případě aspnetapp.pfx, musí odpovídat názvu sestavení projektu.
crypticpassword
se používá jako stand-in pro heslo vlastního výběru. Pokud konzola vrátí "Platný certifikát HTTPS je již k dispozici", důvěryhodný certifikát již ve vašem úložišti existuje. Dá se exportovat pomocí konzoly MMC.
Konfigurace tajných kódů aplikací pro certifikát:
dotnet user-secrets -p aspnetapp\aspnetapp.csproj init
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword"
Poznámka:
Poznámka: Heslo musí odpovídat heslu použitému pro certifikát.
Spusťte image kontejneru s nakonfigurovaným ASP.NET Core pro 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
Po spuštění aplikace přejděte do https://localhost:8001
webového prohlížeče.
Vyčištění
Pokud se tajné kódy a certifikáty nepoužívají, nezapomeňte je vyčistit.
dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean
S pomocí PowerShellu
K vygenerování certifikátů podepsaných svým držitelem můžete použít PowerShell. Klienta PKI lze použít k vygenerování certifikátu podepsaného svým držitelem.
$cert = New-SelfSignedCertificate -DnsName @("contoso.com", "www.contoso.com") -CertStoreLocation "cert:\LocalMachine\My"
Certifikát se vygeneruje, ale pro účely testování by se měl umístit do úložiště certifikátů pro testování v prohlížeči.
$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)
V tomto okamžiku by měly být certifikáty zobrazitelné z modulu snap-in konzoly MMC.
Ukázkový kontejner můžete spustit v subsystému Windows pro 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
Poznámka:
Všimněte si, že při připojování svazku by se cesta k souboru mohla zpracovat odlišně podle hostitele. Například ve WSL můžete nahradit /c/certs/mnt/c/certs.
Pokud používáte kontejner vytvořený dříve pro Windows, bude příkaz spustit vypadat takto:
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
Jakmile je aplikace vzhůru, přejděte do contoso.com:8001 v prohlížeči.
Ujistěte se, že jsou položky hostitele aktualizovány tak, aby contoso.com
odpovídal na správnou IP adresu (například 127.0.0.1). Pokud se certifikát nerozpozná, ujistěte se, že certifikát načtený s kontejnerem je důvěryhodný na hostiteli a že existují odpovídající SAN / DNS záznamy pro contoso.com
.
Vyčištění
$cert | Remove-Item
Get-ChildItem $certKeyPath | Remove-Item
$rootCert | Remove-item
S OpenSSL
K vytvoření certifikátů podepsaných svým držitelem můžete použít OpenSSL . Tento příklad používá WSL / Ubuntu a prostředí bash s OpenSSL
.
Tento příkaz vygeneruje .crt a .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
K získání souboru .pfx použijte následující příkaz:
openssl pkcs12 -export -out $PARENT.pfx -inkey $PARENT.key -in $PARENT.crt
Poznámka:
Od verze .NET 5 může Kestrel kromě souborů .pfx s heslem používat soubory .crt a PEM kódované .key.
V závislosti na hostitelském operačním systému musí být certifikát důvěryhodný. Na hostiteli s Linuxem je "důvěra" v certifikát jiná a závisí na konkrétní distribuci.
Pro účely této příručky je tady příklad ve Windows pomocí PowerShellu:
Import-Certificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root'
Spusťte ukázku pomocí následujícího příkazu ve 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
Poznámka:
Ve WSL se cesta pro připojení svazku může změnit v závislosti na konfiguraci.
V PowerShellu spusťte následující příkaz:
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
Jakmile je aplikace vzhůru, přejděte do contoso.com:8001 v prohlížeči.
Ujistěte se, že jsou položky hostitele aktualizovány tak, aby contoso.com
odpovídal na správnou IP adresu (například 127.0.0.1). Pokud se certifikát nerozpozná, ujistěte se, že certifikát načtený s kontejnerem je důvěryhodný na hostiteli a že existují odpovídající SAN / DNS záznamy pro contoso.com
.
Vyčištění
Po dokončení testování nezapomeňte certifikáty podepsané svým držitelem vyčistit.
Get-ChildItem $certKeyPath | Remove-Item