我正在努力为 Docker 上的 nginx 代理生成证书。
我按照以下方式设计了docker-compose:
version: "3"
services:
postgres-db:
image: postgres:15.2-alpine
container_name: postgres-db
restart: unless-stopped
env_file:
- .env
volumes:
- ./postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- container-network
app1:
image: app1:development
container_name: app2
restart: unless-stopped
env_file:
- .env
ports:
- "3002:3000"
networks:
- container-network
app2:
image: app2:development
container_name: app2
restart: unless-stopped
env_file:
- .env
ports:
- "3001:3000"
networks:
- container-network
nginx:
image: nginx:latest
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certbot/www/:/var/www/certbot/:ro
- ./certbot/conf/:/etc/letsencrypt/:ro
networks:
- container-network
certbot:
image: certbot/certbot:latest
container_name: certbot
volumes:
- ./certbot/www/:/var/www/certbot/:rw
- ./certbot/conf/:/etc/letsencrypt/:rw
networks:
container-network:
driver: bridge
我的 nginx 配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name app1.com www.app1.com;
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
# Redirect all http traffic to https
server {
listen 443 ssl;
server_name app1.com www.app1.com;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/app1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name app2.app1.com
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
# Redirect all http traffic to https
server {
listen 443 ssl;
server_name app2.app1.com
server_tokens off;
ssl_certificate /etc/letsencrypt/live/app2.app1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app2.app1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
我已经设法使用提供的脚本生成必要的证书这里但是当访问我的网站时,我的浏览器会警告我ERR_CERT_AUTHORITY_INVALID
错误,并告诉我颁发的证书有一个“localhost”通用名称。
所有文件都在运行,并且 nginx 似乎没有太多抱怨......
要明确的是,这不是我所期望的,我期望获得我的 app.com 域名的证书。
我是否缺少证书或者流程中的某个步骤?
答案1
Let's Encrypt 为您的域生成自签名证书而不是有效证书时出现的问题可能与您的 Docker 设置和 Nginx 的配置有关,或者与您获取证书所遵循的过程有关。以下是排除故障和解决此问题的一些步骤:
- 验证域配置:确保您的域名正确
app1.com
指向app2.app1.com
运行 Docker 的服务器的公共 IP。这对于 Let's Encrypt 验证您的域名至关重要。 - 检查 Certbot 配置:确保您已正确运行 Certbot 来为您的域生成证书。这通常涉及运行类似于的命令,
certbot certonly --webroot -w /var/www/certbot -d app1.com -d www.app1.com
并且对于 也类似app2.app1.com
。这些命令应在服务器上执行,您应该看到指示成功颁发的输出。 - Nginx 配置:您的 Nginx 配置在指向 Let's Encrypt 证书方面似乎是正确的。但是,请确保Docker 容器内的 Nginx 可以访问路径
/etc/letsencrypt/live/app1.com/fullchain.pem
和。/etc/letsencrypt/live/app1.com/privkey.pem
- Docker 卷:仔细检查您的 Docker 卷映射
docker-compose.yml
。确保 Let's Encrypt 证书的路径正确安装到 Nginx 和 Certbot 容器中。 - 原木检验:查看 Nginx 和 Certbot 容器的日志。有时,日志可以提供有关证书颁发过程中配置错误或错误的提示。
- 防火墙和端口:确保您的防火墙和网络配置允许外部访问端口 80 和 443,因为这些是 Let's Encrypt 证书颁发期间 ACME 质询所必需的。
- 续订脚本:如果您使用自定义脚本进行证书续订,请确保正确配置和执行该脚本。Certbot 通常负责续订,但任何自定义脚本都应正确指向正确的域和 webroot 路径。
- 证书权限:有时,证书文件的权限问题可能会导致问题。确保证书
/etc/letsencrypt/live/
具有适当的读取权限。 - 调试:如果问题仍然存在,您可以以更详细的模式运行 Certbot 以获取有助于识别问题的详细日志。
如果您已确认以上所有内容但仍然遇到问题,则在 Docker 之外手动运行 Certbot 命令可能会有所帮助,以查看 Docker 环境或 Certbot 配置本身是否存在问题。