Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Существуют различные способы создания и использования самозаверяемых сертификатов для сценариев разработки и тестирования. В этой статье рассматривается использование самозаверяющих сертификатов с dotnet dev-certs
, а также другие параметры, такие как PowerShell
и OpenSSL
.
Затем можно проверить, будет ли сертификат загружен с помощью примера, например приложения ASP.NET Core , размещенного в контейнере.
Предпосылки
Для dotnet dev-certs
убедитесь, что установлена соответствующая версия .NET.
Для работы с этим примером требуется Docker 17.06 или клиент Docker более поздней версии.
Подготовка примера приложения
В этом руководстве вы будете использовать образец приложения и вносить изменения, где это необходимо.
Убедитесь, что пример приложения Dockerfile использует .NET 8.
В зависимости от операционной системы узла может потребоваться обновить среду выполнения ASP.NET. Например, чтобы нацелиться на соответствующую среду выполнения Windows, измените mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime
на mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime
в файле Dockerfile.
Например, это поможет проверить сертификаты в 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"]
При тестировании сертификатов в Linux, можно использовать существующий Dockerfile.
Убедитесь, что aspnetapp.csproj
включает соответствующий целевой фреймворк:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<!--Other Properties-->
</PropertyGroup>
</Project>
Замечание
Если вы хотите использовать dotnet publish
параметры для оптимизации развертывания, убедитесь, что соответствующие зависимости включены для поддержки SSL-сертификатов. Обновите файл dotnet-docker\samples\aspnetapp\aspnetapp.csproj , чтобы убедиться, что соответствующие сборки включены в контейнер. С целью ознакомления, проверьте, как обновить файл .csproj, чтобы обеспечить поддержку SSL-сертификатов при использовании обрезки для автономных развертываний.
Убедитесь, что вы указываете на демонстрационное приложение.
cd .\dotnet-docker\samples\aspnetapp
Создайте контейнер для локального тестирования.
docker build -t aspnetapp:my-sample -f Dockerfile .
Создание самозаверяющего сертификата
Вы можете создать самозаверяющий сертификат:
Использование dotnet dev-certs
Вы можете использовать dotnet dev-certs
для работы с самозаверяными сертификатами.
dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p crypticpassword
dotnet dev-certs https --trust
Замечание
Имя сертификата в этом случае aspnetapp.pfx должно соответствовать имени сборки проекта.
crypticpassword
используется в качестве заменителя для пароля по вашему выбору. Если консоль возвращает "Действительный сертификат HTTPS уже присутствует". Доверенный сертификат уже существует в вашем хранилище. Его можно экспортировать с помощью консоли MMC.
Настройте секреты приложения для сертификата:
dotnet user-secrets -p aspnetapp\aspnetapp.csproj init
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword"
Замечание
Примечание. Пароль должен совпадать с паролем, используемым для сертификата.
Запустите образ контейнера с 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
После запуска приложения перейдите на https://localhost:8001
, в вашем веб-браузере.
Очистка
Если секреты и сертификаты не используются, обязательно очистите их.
dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean
С помощью PowerShell
PowerShell можно использовать для создания самозаверяющих сертификатов. Клиент PKI можно использовать для создания самозаверяющего сертификата.
$cert = New-SelfSignedCertificate -DnsName @("contoso.com", "www.contoso.com") -CertStoreLocation "cert:\LocalMachine\My"
Сертификат будет создан, но для тестирования должен размещаться в хранилище сертификатов для тестирования в браузере.
$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)
На этом этапе сертификаты должны просматриваться из оснастки MMC.
Пример контейнера можно запустить в подсистеме Windows для 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
Замечание
Обратите внимание, что при подключении тома путь к файлу может обрабатываться по-разному в зависимости от хоста. Например, в WSL можно заменить /c/certs на /mnt/c/certs.
Если вы используете контейнер, созданный ранее для Windows, команда выполнения будет выглядеть следующим образом:
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
После завершения работы приложения перейдите к contoso.com:8001 в браузере.
Убедитесь, что записи хостов обновлены, чтобы contoso.com
отвечал на соответствующий IP-адрес (например, 127.0.0.1). Если сертификат не распознается, убедитесь, что сертификат, загруженный с контейнером, также является доверенным на хосте, и существуют соответствующие записи SAN / DNS для contoso.com
.
Очистка
$cert | Remove-Item
Get-ChildItem $certKeyPath | Remove-Item
$rootCert | Remove-item
С помощью OpenSSL
С помощью OpenSSL можно создать самозаверяющий сертификат. В этом примере используются WSL / Ubuntu и оболочка bash с OpenSSL
.
Эта команда создает .crt и .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
Чтобы получить .pfx, используйте следующую команду:
openssl pkcs12 -export -out $PARENT.pfx -inkey $PARENT.key -in $PARENT.crt
Замечание
Начиная с .NET 5, Kestrel может принимать CRT и PEM-кодированные файлы .key в дополнение к PFX-файлам с паролем.
В зависимости от операционной системы хоста, сертификат должен быть признан доверенным. На узле Linux процесс доверия сертификату отличается и зависит от дистрибутива.
В этом руководстве приведен пример в Windows с помощью PowerShell:
Import-Certificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root'
Запустите пример с помощью следующей команды в 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
Замечание
В WSL путь монтирования тома может измениться в зависимости от конфигурации.
Выполните следующую команду в 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
После завершения работы приложения перейдите к contoso.com:8001 в браузере.
Убедитесь, что записи хостов обновлены, чтобы contoso.com
отвечал на соответствующий IP-адрес (например, 127.0.0.1). Если сертификат не распознается, убедитесь, что сертификат, загруженный с контейнером, также является доверенным на хосте, и существуют соответствующие записи SAN / DNS для contoso.com
.
Очистка
Не забудьте удалить самоподписанные сертификаты после завершения тестирования.
Get-ChildItem $certKeyPath | Remove-Item