Sdílet prostřednictvím


Generování certifikátů podepsaných svým držitelem pomocí rozhraní příkazového řádku .NET

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 svým držitelem a dalšími možnostmi dotnet dev-certs, jako PowerShell je 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

Ujistěte dotnet dev-certsse, ž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ý soubor Dockerfile aplikace 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, přejděte mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime do mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime 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, aspnetapp.csproj že obsahuje odpovídající cílovou architekturu:

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

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

</Project>

Poznámka:

Pokud chcete k oříznutí nasazení použít dotnet publish parametry, ujistěte se, že jsou pro podporu certifikátů SSL zahrnuté příslušné závislosti. Aktualizujte soubor dotnet-docker\samples\aspnetapp\aspnetapp.csproj, aby se zajistilo, že jsou v kontejneru zahrnutá příslušná sestavení. Pokud potřebujete odkaz, podívejte se, jak aktualizovat soubor .csproj tak, aby podporoval certifikáty SSL při použití oříznutí 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 jeho držitelem (self-signed certificate)

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 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 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é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 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 contoso.com tak, aby odpovídaly na odpovídající IP adresu (například 127.0.0.1). Pokud se certifikát nerozpozná, ujistěte se, že certifikát načtený s kontejnerem je na hostiteli také důvěryhodný a že 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 se certifikát považuje za důvěryhodný a závislý na 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 připojení svazku může v závislosti na konfiguraci změnit.

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 contoso.com tak, aby odpovídaly na odpovídající IP adresu (například 127.0.0.1). Pokud se certifikát nerozpozná, ujistěte se, že certifikát načtený s kontejnerem je na hostiteli také důvěryhodný a že 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

Viz také