Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Существуют различные способы создания и использования самозаверяемых сертификатов для сценариев разработки и тестирования. В этой статье рассматривается использование самозаверяющих сертификатов с 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