Вопрос или проблема
Я разрабатываю контейнер Windows для своего старого приложения ASP.NET Framework(4.8) MVC и успешно собрал и развернул его с помощью Docker. Однако у меня возникли проблемы при попытке добавить самоподписанный SSL-сертификат для включения HTTPS для сайта IIS внутри контейнера. Несмотря на многочисленные попытки, мне не удалось добиться успеха.
Ниже приведен Dockerfile, который я использую:
# Используйте официальный образ среды выполнения ASP.NET для .NET Framework 4.8
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019
# Установите рабочую директорию
WORKDIR /inetpub/wwwroot
# Скопируйте файлы приложения ASP.NET
COPY Macs.FrontEnd/. .
# Скопируйте существующий сертификат в контейнер
COPY certificates/exmaple.pfx C:/certificates/exmaple.pfx
# Установите разрешения для доступа IIS к файлам приложения
RUN cmd.exe /c "icacls C:\inetpub\wwwroot /grant \"IIS_IUSRS:(OI)(CI)RX\" /T"
RUN cmd.exe /c "icacls C:\inetpub\wwwroot /grant \"IIS APPPOOL\DefaultAppPool:(OI)(CI)RX\" /T"
# Импортируйте существующий сертификат с использованием SecureString
RUN powershell -Command " \
$securePassword = ConvertTo-SecureString -String 'SecurePwdGoesHere' -Force -AsPlainText; \
Import-PfxCertificate -FilePath 'C:\certificates\exmaple.pfx' -CertStoreLocation Cert:\LocalMachine\My -Password $securePassword \
"
# Получите отпечаток сертификата и сохраните его в файл
RUN powershell -Command " \
$thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -match 'exmaple.macs.local' }).Thumbprint; \
Set-Content -Path C:\certificates\cert-thumbprint.txt -Value $thumbprint \
"
# Прочитайте отпечаток из файла и привяжите его к IIS с помощью netsh
RUN powershell -Command " \
$thumbprint = Get-Content -Path C:\certificates\cert-thumbprint.txt; \
netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumbprint appid='{00112233-4455-6677-8899-AABBCCDDEEFF}' \
"
# Откройте порты HTTP и HTTPS
EXPOSE 80
EXPOSE 443
Я использовал следующую команду для генерации самоподписанного сертификата IIS
$cert = New-SelfSignedCertificate -DnsName "example.macs.local" -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(1)
# Экспортируйте сертификат в файл .pfx
$certPath = "$env:USERPROFILE\example.pfx"
$securePassword = ConvertTo-SecureString -String 'SecurePwdGoesHere' -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath $certPath -Password $securePassword
Write-Host "Сертификат сгенерирован и экспортирован в: $certPath"
Может кто-нибудь предоставить идеи или рекомендации по поводу того, что может быть причиной проблемы и как правильно добавить самоподписанный SSL-сертификат для сайта, размещенного на IIS, внутри контейнера Windows? Ваша помощь была бы очень признательна!
Ответ или решение
Добавление самоподписанного SSL-сертификата в контейнер Windows для устаревшего приложения ASP.NET MVC
В процессе разработки контейнера Windows для вашего устаревшего приложения ASP.NET Framework 4.8 вы столкнулись с проблемой добавления самоподписанного SSL-сертификата для активации HTTPS в IIS. Давайте рассмотрим, как правильно это сделать.
1. Генерация сертификата
Вы уже сгенерировали самоподписанный сертификат и экспортировали его в формат PFX. Это является первым шагом. Убедитесь, что команда создала сертификат и успешно экспортировала его. Чтобы предотвратить потенциальные ошибки в будущем, выполните проверку:
Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -match 'example.macs.local' }
Эта команда должна вернуть ваш сертификат. Если вы не видите сертификат, посмотрите на имя общего использования (dnsName
), чтобы убедиться, что оно совпадает с тем, что вы используете в настройках сервера.
2. Корректировка Dockerfile
Ваш Dockerfile выглядит довольно хорошо, однако есть некоторые аспекты, которые стоит пересмотреть. Ниже приведены шаги, которые помогут вам устранить потенциальные проблемы:
-
Копирование сертификата:
Убедитесь, что путь к PFX-файлу корректен. Проверьте опечатку в имени файлаexmaple.pfx
. Если он действительно называетсяexample.pfx
, это может вызвать путаницу. -
Установка правильных прав доступа:
Вы уже настроили права доступа для папкиC:\inetpub\wwwroot
, однако уточните, если ваш сертификат требует дополнительных прав для группы IIS_IUSRS, лучше уточните для конкретного пользователя, если это имеет значение. -
Импорт сертификата:
Приведите следующую команду в порядок. Ваша команда для импорта сертификата должна четко указывать на файл в C:/certificates:RUN powershell -Command " \ $securePassword = ConvertTo-SecureString -String 'SecurePwdGoesHere' -Force -AsPlainText; \ Import-PfxCertificate -FilePath 'C:\certificates\example.pfx' -CertStoreLocation Cert:\LocalMachine\My -Password $securePassword"
-
Получение отпечатков:
Убедитесь, что после импорта сертификат существует. Отслеживание процесса помогает в диагностике. Вот улучшенная команда проверки:RUN powershell -Command " \ $thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -match 'example.macs.local' }) | Select-Object -First 1; \ if ($thumbprint) { Set-Content -Path C:\certificates\cert-thumbprint.txt -Value $thumbprint.Thumbprint } else { throw 'Certificate not found' }"
-
Настройка bind для SSL:
После получения отпечатка используйте правильные свойства для добавления сертификата в сетевой стек:RUN powershell -Command " \ $thumbprint = Get-Content -Path C:\certificates\cert-thumbprint.txt; \ netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumbprint appid='{00112233-4455-6677-8899-AABBCCDDEEFF}'"
3. Проверка и отладка
После завершения сборки контейнера, проверьте его состояние:
-
Убедитесь, что порт 443 прослушивается. Вы можете использовать утилиты, такие как
netstat
илиcurl
для проверки соединений. -
Если что-то идет не так, проверьте логи IIS. Они обычно находятся по пути
C:\inetpub\logs\LogFiles
. -
Используйте
docker logs <container_id>
, чтобы получить логи контейнера, что может помочь в выявлении ошибок.
Заключение
Добавление самоподписанного SSL-сертификата в контейнер Windows для ASP.NET MVC требует внимания к деталям, начиная с создания сертификата и заканчивая точной конфигурацией Dockerfile. Соблюдая приведенные выше рекомендации, вы сможете успешно интегрировать HTTPS в вашу устаревшую веб-приложение. Если возникают дополнительные проблемы, всегда стоит возвращаться к логам и выводам команд PowerShell для диагностики.