生成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。

相关推荐
AlfredZhao10 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346616 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪17 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈1 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
程序员mine1 天前
HTTPS-TLS加密与证书完全指南(中)
网络协议·https·ssl
凡人叶枫2 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++