NGINX + OpenSSL + Docker。无法加载证书密钥权限被拒绝。SSL:错误:0200100D:系统

NGINX + OpenSSL + Docker。无法加载证书密钥权限被拒绝。SSL:错误:0200100D:系统

我想在 docker 上使用 nginx 反向代理部署 SSL 认证的 angular 应用(使用 docker compose)。我已经使用以下代码生成了自签名证书:openssl并对 nginx 配置文件进行了配置。但我在 docker 容器中收到错误消息:

[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:[...]

这是docker compose:

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 配置文件(web-app 服务来自另一个 docker compose):

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 容器,但我不知道该怎么做。(仅使用docker compose或compose + dockerfile,而不是docker run / docker exec)。

如果我创建一个dockerfile并将其与compose分开,则部署时我会得到:

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

当我看到 aims.key 编码是 ASCII 时,我无法按照建议进行转换这个帖子(甚至使用 sudo)。

答案1

无论您的 docker 配置如何,nginx都会以 nginx 配置文件中指定的用户身份启动一个进程。我认为您收到“权限被拒绝”错误是因为您使用 sudo 生成了证书。

  1. 检查 nginx 以哪个用户身份运行。在 shell 中输入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 配置的顶部。

相关内容