NGINX + OpenSSL + Докер. Не удается загрузить ключ сертификата. Разрешение отклонено. SSL: ошибка: 0200100D: система

Я хочу развернуть угловое приложение, сертифицированное SSL, с использованием обратного прокси-сервера nginx на докере (с помощью docker compose). Я создал самозаверяющий сертификат с помощью openssl и сделал настройки в конфигурационном файле nginx. Но я получаю сообщение об ошибке в контейнере докеров:

[emerg] 1#1: cannot load certificate key "/etc/ssl/private/aims.key": BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied:fopen('/etc/ssl/private/aims.key','r') error:2006D002:BIO routines:BIO_new_file:system lib)
nginx: [emerg] cannot load certificate key "/etc/ssl/private/aims.key": BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied:fopen('/etc/ssl/private/aims.key','r') error:2006D002:BIO routines:BIO_new_file:system lib)

Я сгенерировал ключ с помощью этой команды из это суть:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout aims.key -out aims.crt -config aims.conf -passin pass:[...]

Это состав докера:

version: "3.8"
name: aims

services:
  ...

  web-app-proxy:
    image: nginx:alpine
    container_name: web_app_proxy
    ports:
      - 443:443
      - 80:80
    volumes:
      - ./web_app_proxy.nginx:/etc/nginx/nginx.conf:ro
      - ./aims.crt:/etc/ssl/certs/aims.crt
      - ./aims.key:/etc/ssl/private/aims.key

Это конфигурационный файл nginx (служба веб-приложения взята из другого набора докеров):

worker_processes 1;

events { worker_connections 1024; }
http {
    sendfile on;
    large_client_header_buffers 4 32k;

    upstream web-app {
        server web-app:4200;
    }

    server {
        listen 80;
        server_name web-app;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name web-app;

        ssl_certificate /etc/ssl/certs/aims.crt;
        ssl_certificate_key /etc/ssl/private/aims.key;

        location / {
            proxy_pass         http://web-app;
            proxy_redirect     off;
            proxy_http_version 1.1;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   X-Forwarded-Host $server_name;
            proxy_buffer_size           128k;
            proxy_buffers               4 256k;
            proxy_busy_buffers_size     256k;
        }
    }
}

Я видел, что проблема связана с запуск контейнера докеров от имени root, но я не знаю, как это сделать. (Используя только docker compose или compose + dockerfile, а не docker run/docker exec).

Если я создаю файл докеры и отделяю его от компоновки, при развертывании я получаю:

PEM_read_bio_PrivateKey() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: ANY PRIVATE KEY) 

Когда я вижу, что кодировка aim.key — это ASCII, и я не могу выполнить преобразование, как это предлагается в эта почта (даже используя sudo).

1 ответ
1

Независимо от вашей конфигурации докера, nginx процесс будет запущен от имени пользователя, указанного в конфигурационном файле nginx. Я считаю, что вы получаете сообщение об ошибке «Отказано в доступе», потому что вы создали свои сертификаты с помощью sudo.

  1. Проверьте, под каким пользователем работает nginx. В оболочке введите sudo ps aux | grep nginx

    Вы должны увидеть что-то вроде этого: Мой пользователь — nginx, ваш может быть www, www-data или что-то еще.

root      776967  0.0  0.0  22332  7884 ?        Ss   Oct23   0:00 nginx: master process /usr/sbin/nginx
nginx    1262783  0.5  1.8 447744 427960 ?       S    16:18   0:00 nginx: worker process
nginx    1262784  0.5  1.8 447744 427960 ?       S    16:18   0:00 nginx: worker process
nginx    1262785  0.5  1.8 447744 427960 ?       S    16:18   0:00 nginx: worker process
nginx    1262786  0.5  1.8 447744 427960 ?       S    16:18   0:00 nginx: worker process
nginx    1262787  0.0  0.0  25864  6392 ?        S    16:18   0:00 nginx: cache manager process

Теперь вам нужно предоставить доступ к файлам сертификатов вашему пользователю.

sudo chown nginx:nginx /etc/ssl/certs/aims.crt
sudo chown nginx:nginx /etc/ssl/private/aims.key

Замените «nginx» пользователем из приведенного выше вывода.

  1. Хотя это не рекомендуется, вы можете указать nginx работать от имени пользователя root. Добавлять user root; в начало вашей конфигурации nginx.

Шимон Покрывка

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *