Загрузка объема в контейнер Docker

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

Я использую Ubuntu на своем хост-компьютере, и у меня есть контейнер Docker, также работающий на Ubuntu, который содержит веб-сайт ASP .NET. Проблема в том, что я не могу понять, как заставить контейнер установить монтирование моих SSL-ключей с моего хост-компьютера. В моем файле docker-compose.yml указаны следующие тома.

    volumes:
      - /etc/letsencrypt/archive/example.com/fullchain.pem:/etc/ssl/certs/fullchain.pem:ro
      - /etc/letsencrypt/archive/example.com/privkey.pem:/etc/ssl/private/privkey.pem:ro
      - app-data:/app/data
      - app-data:/root/.aspnet/DataProtection-Keys

volumes:
  app-data:

Я также проверил, что эти файлы существуют, используя cat /etc/letsencrypt/archive/example.com/privkey1.pem и cat /etc/letsencrypt/archive/example.com/fullchain1.pem, которые работали прекрасно. Но когда я собираю мой контейнер, я всегда получаю следующие ошибки, потому что он не может найти файл.

Unhandled exception. Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
   at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)
   at Internal.Cryptography.Pal.OpenSslX509CertificateReader.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   at Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps(ListenOptions listenOptions, String fileName, String password)

Я также убедился, что права установлены правильно, выполнив следующее безрезультатно.

sudo chmod 644 /etc/letsencrypt/archive/example.com/fullchain1.pem
sudo chmod 600 /etc/letsencrypt/archive/example.com/privkey1.pem
sudo chmod 755 /etc/letsencrypt/archive
sudo chmod 755 /etc/letsencrypt/archive/example.com

Затем я попробовал вручную запустить контейнер, но получаю ту же ошибку, из-за которой контейнер мгновенно закрывается.

docker run -it --rm \
  -v /etc/letsencrypt/archive/example.com/fullchain1.pem:/etc/ssl/certs/fullchain.pem:ro \
  -v /etc/letsencrypt/archive/example.com/privkey1.pem:/etc/ssl/private/privkey.pem:ro \
  server /bin/bash

Наконец, вот мой класс Program, который пытается считать сертификат HTTPS, что и вызывает фактическую ошибку ненахождения файла.

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                    .UseKestrel(options =>
                    {
                        options.ListenAnyIP(80); // HTTP
                        options.ListenAnyIP(443, listenOptions =>
                        {
                            listenOptions.UseHttps("/etc/ssl/certs/fullchain.pem", "/etc/ssl/private/privkey.pem");
                        });
                    });
            });
    }

Ответ или решение

Загрузка SSL сертификатов в Docker контейнер для ASP.NET на Ubuntu

Использование Docker для развертывания вашего ASP.NET веб-приложения — это современный и эффективный подход. Тем не менее, корректная настройка SSL сертификатов может вызвать некоторые трудности, как это и наблюдается в вашем случае. Давайте более подробно рассмотрим шаги, которые вы можете предпринять для решения проблемы.

Проверка конфигурации томов в docker-compose.yml

Ваши настройки томов в файле docker-compose.yml выглядят корректно, однако я замечаю, что вы указываете путь к файлам сертификатов как fullchain.pem и privkey.pem. Убедитесь, что вы ссылаетесь на правильное имя файлов. В вашем примере команд cat, указаны файлы fullchain1.pem и privkey1.pem. Если это так, то вам необходимо обновить пути в конфигурации:

volumes:
  - /etc/letsencrypt/archive/example.com/fullchain1.pem:/etc/ssl/certs/fullchain.pem:ro
  - /etc/letsencrypt/archive/example.com/privkey1.pem:/etc/ssl/private/privkey.pem:ro

Проверка разрешений на файлы

Вы уже предприняли шаги для изменения разрешений файла, но также важно убедиться, что запущенный процесс внутри контейнера имеет доступ к этим файлам. Вы можете попробовать следующее:

  1. Войдите в ваш контейнер через docker exec (предполагая, что контейнер уже запущен):

    docker exec -it <container_id> /bin/bash
  2. Проверьте наличие файлов в указанных вами местах:

    ls -l /etc/ssl/certs/fullchain.pem
    ls -l /etc/ssl/private/privkey.pem

Если файлы существуют, убедитесь, что права доступа установлены правильно, как вы указали — 644 для fullchain.pem и 600 для privkey.pem.

Диагностика ошибок

Ошибка Interop+Crypto+OpenSslCryptographicException на самом деле указывает на проблему с доступом к файлу или его содержимым. Чтобы лучше диагностировать, попробуйте в вашем методе UseHttps добавить проверку существования файлов перед их использованием. Это позволит вам отловить доступные ошибки на этапе инициализации.

if (!File.Exists("/etc/ssl/certs/fullchain.pem") || !File.Exists("/etc/ssl/private/privkey.pem"))
{
    throw new FileNotFoundException("SSL certificate or private key not found.");
}

Альтернативные решения

Если проблема не решается, рассмотрите возможность использования другого подхода:

  • Копирование файлов в контейнер: Вы можете создать образ контейнера, который копирует файлы сертификатов в нужное место внутри самого контейнера. Пример Dockerfile:
FROM ubuntu:latest

COPY /etc/letsencrypt/archive/example.com/fullchain1.pem /etc/ssl/certs/fullchain.pem
COPY /etc/letsencrypt/archive/example.com/privkey1.pem /etc/ssl/private/privkey.pem

# Остальные команды
  • Использование секретов Docker: Если вы используете Docker Swarm, вы можете воспользоваться Docker Secrets, чтобы безопасно передать ваши ключи в контейнер.

Заключение

Работа с SSL сертификатами внутри Docker требует внимательности к деталям, включая правильные пути к файлам, их разрешения и диагностику возможных ошибок. Следуя вышеуказанным шагам, вы сможете успешно загрузить SSL ключи в ваш Docker контейнер для корректной работы вашего приложения ASP.NET. Удачи вам в решении этой задачи!

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

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