生成https免费证书并绑定到nginx

环境说明

我是docker安装的nginx,映射目录要注意一下 才可以签发证书

安装步骤和命令 注意顺序

1.安装 Certbot 客户端

复制代码
sudo yum install epel-release

sudo yum install certbot
# 如果你是 CentOS 8/Stream,可能需要安装 python3-certbot
# sudo yum install certbot python3-certbot

2.手动生成证书

我们将使用 webroot 模式来生成证书,这意味着 Certbot 会在你的网站根目录下放置临时文件进行验证。

  1. 为验证文件创建临时目录: 在宿主机上创建一个用于 Certbot 验证的临时目录。这个目录需要能被宿主机上的 Certbot 访问,并且能够通过 Nginx 的 80 端口对外提供服务。

    bash 复制代码
    sudo mkdir -p /var/www/certbot
  2. 修改 Nginx 容器配置(重要!): 为了让 Certbot 能够验证你的域名,你需要确保 Nginx 容器的 80 端口被正确映射到宿主机,并且 Nginx 能够服务 Certbot 放置的验证文件。

    示例 nginx.conf (Nginx 容器内的配置): 在 Nginx 的 HTTP server block 中添加一个专门用于 Certbot 验证的 location 块。

    bash 复制代码
    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文件

    bash 复制代码
    version: '3.8'
    services:
      nginx:
        image: nginx:latest
        container_name: my-nginx
        ports:
          - "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:ro
        restart: unless-stopped

    证书文件通常位于 /etc/letsencrypt/live/yourdomain.com/ 目录下。

  3. 配置 Nginx 使用 HTTPS 证书

    现在你已经有了证书文件,可以修改 Nginx 容器的配置来启用 HTTPS。

    1).修改 docker-compose.yml (或 docker run),挂载证书目录 : 你需要将宿主机上的 Certbot 证书目录挂载到 Nginx 容器内部,以便 Nginx 能够访问它们。

    bash 复制代码
    version: '3.8'
    services:
      nginx:
        image: nginx:latest
        container_name: my-nginx
        ports:
          - "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。

    bash 复制代码
    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 Stapling
        ssl_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;
        }
    }
  4. 重新启动 Nginx 容器

    docker-compose restart 或者 docker restart 容器id

  5. 验证 HTTPS 配置

    现在,打开你的浏览器,访问 https://yourdomain.com。你应该能看到一个安全的小锁图标,并且所有 HTTP 请求都自动重定向到了 HTTPS。

相关推荐
爱喝西北风的东北风1 小时前
Linux树莓派项目实战:外网访问、PWM呼吸灯、超声波测距与驱动开发
linux·运维·驱动开发
铃木隼.1 小时前
haproxy搭建nginx网站访问
运维·nginx
Liugh1 小时前
图解 Linux 内核网络栈
linux
ZaaaaacK2 小时前
Linux系统远程操作和程序编译
linux·运维·postgresql
Y_3_72 小时前
Netty实战:从核心组件到多协议实现(超详细注释,udp,tcp,websocket,http完整demo)
linux·运维·后端·ubuntu·netty
测试专家3 小时前
ARINC653系统架构
大数据·linux·运维
IT_10243 小时前
Nginx教程:概念+安装+SSL安装,通过调优Nginx来提高应用性能
运维·nginx·ssl
qwfys2004 小时前
一次网络问题排查
linux·kylin·network·v10
孤邑5 小时前
【Linux】DBUS基础
linux·运维·服务器
孙克旭_5 小时前
day037-openssh服务与http协议
linux·运维·网络·网络协议·http