我想在 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 生成了证书。
- 检查 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”替换为用户
- 虽然不建议这样做,但您可以告诉 nginx 以 root 身份运行。添加
user root;
到 nginx 配置的顶部。