Generování certifikátů podepsaných svým držitelem pomocí .NET CLI
Při použití certifikátů podepsaných svým držitelem existují různé způsoby, jak je vytvořit a použít pro scénáře vývoje a testování. V této příručce se budeme řídit používáním certifikátů podepsaných svým držitelem (self-signed certificates) s a dalšími dotnet dev-certs možnostmi, jako jsou PowerShell a OpenSSL .
Pak můžete ověřit, že se certifikát načte, pomocí příkladu, jako je ASP.NET Core aplikace hostovaná v kontejneru.
Požadavky
V ukázce můžete využít .NET Core 3.1 nebo .NET 5.
Pro dotnet dev-certs nezapomeňte mít nainstalovanou příslušnou verzi rozhraní .NET:
Tato ukázka vyžaduje Docker 17.06 nebo novější klienta Dockeru.
Příprava ukázkové aplikace
V závislosti na modulu runtime, který chcete použít pro testování, musíte připravit ukázkovou aplikaci, a to buď .NET Core 3.1, nebo .NET 5.
V této příručce použijete ukázkovou aplikaci a tam, kde je to vhodné, provedete změny.
Ukázková aplikace .NET Core 3.1
Získání ukázkové aplikace
git clone https://github.com/dotnet/dotnet-docker/
Přejděte do úložiště místně a otevřete pracovní prostor v editoru.
Poznámka
Pokud chcete k oříznutí nasazení použít dotnet publish, měli byste se ujistit, že jsou pro podporu certifikátů SSL zahrnuté příslušné závislosti. Aktualizujte soubor dotnet-docker\samples\aspnetapp\aspnetapp.csproj, abyste zajistili, že kontejner obsahuje příslušná sestavení. Pokud chcete zjistit referenční informace, podívejte se, jak aktualizovat soubor .csproj tak, aby podporoval certifikáty SSL při použití ořezávání pro samostatná nasazení.
Ujistěte aspnetapp.csproj se, že objekt obsahuje příslušnou cílovou rozhraní:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>.netcoreapp3.1</TargetFramework>
<!--Other Properties-->
</PropertyGroup>
</Project>
Upravte soubor Dockerfile a ujistěte se, že modul runtime odkazuje na .NET Core 3.1:
# https://hub.docker.com/_/microsoft-dotnet-core
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /source
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
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 .
Ukázková aplikace .NET 5
V tomto průvodci by měla být ukázková aplikace aspnetapp zkontrolovaná pro .NET 5.
Zkontrolujte, že soubor Dockerfile ukázkové aplikace používá .NET 5.
V závislosti na operačním systému hostitele může ASP.NET aktualizovat modul runtime hostitele. Například změna z mcr.microsoft.com/dotnet/aspnet:5.0-nanoservercore-2009 AS runtime na v souboru Dockerfile vám pomůže s cílením na odpovídající mcr.microsoft.com/dotnet/aspnet:5.0-windowsservercore-ltsc2019 AS runtime Windows runtime.
To vám například pomůže s testováním certifikátů na Windows:
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.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
# Uses the 2009 release; 2004, 1909, and 1809 are other choices
FROM mcr.microsoft.com/dotnet/aspnet:5.0-windowsservercore-ltsc2019 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]
Pokud testujeme certifikáty v Linuxu, můžete použít existující soubor Dockerfile.
Ujistěte aspnetapp.csproj se, že objekt obsahuje příslušnou cílovou rozhraní:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<!--Other Properties-->
</PropertyGroup>
</Project>
Poznámka
Pokud chcete použít parametry dotnet publish pro oříznutí nasazení, ujistěte se, že jsou zahrnuty příslušné závislosti pro podporu certifikátů SSL.
Aktualizujte soubor dotnet-docker\samples\aspnetapp\aspnetapp.csproj, abyste zajistili, že kontejner obsahuje příslušná sestavení. Pokud chcete zjistit referenční informace, podívejte se, jak aktualizovat soubor .csproj tak, aby podporoval certifikáty SSL při použití ořezává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í certifikátu podepsaného svým držitelem (self-signed certificate)
Můžete vytvořit certifikát podepsaný svým držitelem:
Pomocí dotnet dev-certs
Můžete použít pro dotnet dev-certs práci s certifikáty podepsaných svým držitelem. Tento příklad používá konzolu PowerShellu.
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 předsudk pro heslo podle vašeho výběru. Pokud konzola vrátí "Platný certifikát HTTPS už existuje", důvěryhodný certifikát už ve vašem obchodě existuje. Je možné ho exportovat pomocí konzoly MMC.
Konfigurace tajných kódů aplikace pro certifikát:
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword"
Poznámka
Poznámka: Heslo se musí shodovat s heslem použitým pro certifikát.
Spusťte image kontejneru s nakonfigurovanou ASP.NET Core 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 ve webovém https://localhost:8001 prohlížeči na .
Vyčištění
Pokud se tajné kódy a certifikáty používají, nezapomeňte je vyčistit.
dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean
S využitím 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 účely 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 certifikáty měly být zobrazitelné z modulu snap-in KONZOLY MMC.
Ukázkový kontejner můžete spustit v Subsystém 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řipojení svazku může být cesta k souboru zpracována odlišně v závislosti na hostiteli. Například ve WSL můžeme nahradit /c/certs za /mnt/c/certs.
Pokud používáte kontejner sestavený dříve pro Windows, příkaz pro spuštění by vypadal 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
Po spuštění aplikace přejděte do contoso.com:8001 v prohlížeči.
Ujistěte se, že jsou položky hostitele aktualizované pro , aby na příslušnou IP adresu contoso.com odpověděly (například 127.0.0.1). Pokud certifikát nerozpoznáte, ujistěte se, že je certifikát, který je načtený kontejnerem, také důvěryhodný na hostiteli a že pro existuje odpovídající položka SAN nebo contoso.com DNS.
Vyčištění
$cert | Remove-Item
Get-ChildItem $certFilePath | 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 bude používat WSL / Ubuntu a prostředí Bash s OpenSSL .
Tím se 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
V příkladu .aspnetcore 3.1 se použije .pfx heslo a . Od modulu .net 5 runtime může Kestrel také přijmout soubory s kódováním .crt .key PEM.
V závislosti na operačním systému hostitele bude certifikát muset být důvěryhodný. Na hostiteli s Linuxem se důvěryhodnost certifikátu liší a závisí na distribuci.
Pro účely této příručky je tady příklad v článku Windows powershellu:
Import-Certificate -FilePath $certFilePath -CertStoreLocation 'Cert:\LocalMachine\Root'
V případě .NET Core 3.1 spusťte ve WSL 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__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/path/to/certs/:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp
Od verze .NET 5 může Kestrel vzít soubory s kódováním .crt A .key PEM. Ukázku můžete spustit pomocí následujícího příkazu pro .NET 5:
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
Všimněte si, že ve WSL se v závislosti na konfiguraci může změnit cesta připojení svazku.
V případě .NET Core 3.1 Windows spusťte v souboru následující Powershell 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__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample
Pro .NET 5 v Windows spusťte v PowerShellu 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
Po spuštění aplikace přejděte do contoso.com:8001 v prohlížeči.
Ujistěte se, že jsou položky hostitele aktualizované pro , aby na příslušnou IP adresu contoso.com odpověděly (například 127.0.0.1). Pokud certifikát nerozpoznáte, ujistěte se, že je certifikát, který je načtený kontejnerem, také důvěryhodný na hostiteli a že pro existuje odpovídající položka SAN nebo contoso.com DNS.
Vyčištění
Po otestování nezapomeňte certifikáty podepsané svým držitelem vyčistit.
Get-ChildItem $certFilePath | Remove-Item