Добавление самоподписанного сертификата IIS в контейнер Windows для устаревшего приложения ASP.NET MVC

Вопрос или проблема

Я разрабатываю контейнер 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 выглядит довольно хорошо, однако есть некоторые аспекты, которые стоит пересмотреть. Ниже приведены шаги, которые помогут вам устранить потенциальные проблемы:

  1. Копирование сертификата:
    Убедитесь, что путь к PFX-файлу корректен. Проверьте опечатку в имени файла exmaple.pfx. Если он действительно называется example.pfx, это может вызвать путаницу.

  2. Установка правильных прав доступа:
    Вы уже настроили права доступа для папки C:\inetpub\wwwroot, однако уточните, если ваш сертификат требует дополнительных прав для группы IIS_IUSRS, лучше уточните для конкретного пользователя, если это имеет значение.

  3. Импорт сертификата:
    Приведите следующую команду в порядок. Ваша команда для импорта сертификата должна четко указывать на файл в 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"
  4. Получение отпечатков:
    Убедитесь, что после импорта сертификат существует. Отслеживание процесса помогает в диагностике. Вот улучшенная команда проверки:

    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' }"
  5. Настройка 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. Проверка и отладка

После завершения сборки контейнера, проверьте его состояние:

  1. Убедитесь, что порт 443 прослушивается. Вы можете использовать утилиты, такие как netstat или curl для проверки соединений.

  2. Если что-то идет не так, проверьте логи IIS. Они обычно находятся по пути C:\inetpub\logs\LogFiles.

  3. Используйте docker logs <container_id>, чтобы получить логи контейнера, что может помочь в выявлении ошибок.

Заключение

Добавление самоподписанного SSL-сертификата в контейнер Windows для ASP.NET MVC требует внимания к деталям, начиная с создания сертификата и заканчивая точной конфигурацией Dockerfile. Соблюдая приведенные выше рекомендации, вы сможете успешно интегрировать HTTPS в вашу устаревшую веб-приложение. Если возникают дополнительные проблемы, всегда стоит возвращаться к логам и выводам команд PowerShell для диагностики.

Оцените материал
Добавить комментарий

Капча загружается...