生成https免费证书并绑定到nginx
环境说明
我是docker安装的nginx,映射目录要注意一下 才可以签发证书
安装步骤和命令 注意顺序
1.安装 Certbot 客户端
sudo yum install epel-releasesudo yum install certbot
# 如果你是 CentOS 8/Stream,可能需要安装 python3-certbot
# sudo yum install certbot python3-certbot
2.手动生成证书
我们将使用 webroot
模式来生成证书,这意味着 Certbot 会在你的网站根目录下放置临时文件进行验证。
-
为验证文件创建临时目录: 在宿主机上创建一个用于 Certbot 验证的临时目录。这个目录需要能被宿主机上的 Certbot 访问,并且能够通过 Nginx 的 80 端口对外提供服务。
sudo mkdir -p /var/www/certbot
-
修改 Nginx 容器配置(重要!): 为了让 Certbot 能够验证你的域名,你需要确保 Nginx 容器的 80 端口被正确映射到宿主机,并且 Nginx 能够服务 Certbot 放置的验证文件。
示例
nginx.conf
(Nginx 容器内的配置): 在 Nginx 的 HTTP server block 中添加一个专门用于 Certbot 验证的location
块。server {listen 80;listen [::]:80;server_name yourdomain.com www.yourdomain.com; # 替换成你的域名# Certbot 验证路径location /.well-known/acme-challenge/ {root /var/www/certbot; # 注意:这个路径是 Nginx 容器内部的路径}# 其他网站内容location / {root /usr/share/nginx/html; # 你的网站实际文件路径index index.html index.htm;try_files $uri $uri/ =404;} }
示例
docker-compose.yml
(或docker run
命令): 你需要将宿主机上刚才创建的/var/www/certbot
目录挂载到 Nginx 容器内部的/var/www/certbot
路径。yml文件version: '3.8' services:nginx:image: nginx:latestcontainer_name: my-nginxports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.conf:ro # 挂载你的 Nginx 配置- /var/www/certbot:/var/www/certbot:ro # 挂载 Certbot 验证目录- ./html:/usr/share/nginx/html:ro # 你的网站内容# 将来我们会把证书挂载到这里# - /etc/letsencrypt:/etc/letsencrypt:rorestart: unless-stopped
证书文件通常位于
/etc/letsencrypt/live/yourdomain.com/
目录下。 -
配置 Nginx 使用 HTTPS 证书
现在你已经有了证书文件,可以修改 Nginx 容器的配置来启用 HTTPS。
1).修改docker-compose.yml
(或docker run
),挂载证书目录: 你需要将宿主机上的 Certbot 证书目录挂载到 Nginx 容器内部,以便 Nginx 能够访问它们。
version: '3.8' services:nginx:image: nginx:latestcontainer_name: my-nginxports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.conf:ro- /var/www/certbot:/var/www/certbot:ro # 保留这个用于续期- ./html:/usr/share/nginx/html:ro- /etc/letsencrypt:/etc/letsencrypt:ro # **新增:挂载 Certbot 证书目录**restart: unless-stopped
注意:我们挂载了整个
/etc/letsencrypt
目录,这样 Nginx 就可以访问live
目录下的证书
2).修改 Nginx 容器内的nginx.conf
: 在你的 Nginx 配置文件中,添加或修改 HTTPS server block。
server {listen 80;listen [::]:80;server_name yourdomain.com www.yourdomain.com;# HTTP 重定向到 HTTPS (推荐)return 301 https://$host$request_uri; }server {listen 443 ssl http2;listen [::]:443 ssl http2;server_name yourdomain.com www.yourdomain.com;ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # Nginx 容器内的路径ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # Nginx 容器内的路径# 推荐的 SSL 配置 (根据你的 Nginx 版本和需求可能有所不同)ssl_session_cache shared:SSL:10m;ssl_session_timeout 1d;ssl_session_tickets off;ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers off;ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256";# OCSP Staplingssl_stapling on;ssl_stapling_verify on;resolver 8.8.8.8 8.8.4.4 valid=300s; # Google DNS,可以替换为你偏好的 DNS 解析器resolver_timeout 5s;root /usr/share/nginx/html; # 你的网站实际文件路径index index.html index.htm;location / {try_files $uri $uri/ =404;}# 保护 Certbot 验证目录,使其不会被 Nginx 容器的服务流量影响location /.well-known/acme-challenge/ {root /var/www/certbot; # 保持此配置以备续期allow all;} }
-
重新启动 Nginx 容器
docker-compose restart 或者 docker restart 容器id -
验证 HTTPS 配置
现在,打开你的浏览器,访问https://yourdomain.com
。你应该能看到一个安全的小锁图标,并且所有 HTTP 请求都自动重定向到了 HTTPS。