Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

简单配置后签发https证书

  • 配置 域名网站根目录

    vim /etc/nginx/conf.d/default.conf
    

    (如果没有此文件,则需要自己新建)

    server{
        listen      80;
        server_name www.fastcats.top;
        root        /opt/www;
    }
    
    • 这个域名必须要先解析到此服务器,否则无法签发https证书
  • 重启nginx

    systemctl restart nginx
    
  • 采用Let's Encrypt免费3个月的证书,服务器上直接签发

  • 下载签发工具

    yum install -y certbot
    
  • 新建证书存放文件夹并进入

    mkdir -p /etc/letsencrypt
    
    cd /etc/letsencrypt
    
  • 尝试生成单域名证书(可用最简单的--webroot方式) certbot certonly --dry-run --webroot -w /opt/www -d www.fastcats.top --register-unsafely-without-email

    • 这里的最后选择不填email,无法收到3个月续期提醒
      • 可以改成-m zjuygp@gmail.com --agree-tos
    • 这里不保证可以一次成功,所以一定要用--dry-run尝试,避免多次尝试失败后被短期禁用
  • 出现成功提示后,再去掉--dry-run参数,正式生成

  • 最终出现下面的代表成功

    Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/www.fastcats.top/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/www.fastcats.top/privkey.pem
       Your certificate will expire on 2021-06-27. To obtain a new or
       tweaked version of this certificate in the future, simply run
       certbot again. To non-interactively renew *all* of your
       certificates, run "certbot renew"
    
  • 查看证书 certbot certificates

  • 也可尝试生成通配符子域名证书(必须用--manual方式)

    • 先执行certbot certonly --manual -d "*.fastcats.top" --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory,先别动
    • 按要求自己去DNS添加记录,等待确认DNS生效后再回车
  • 再次配置nginx,打开文件 vim /etc/nginx/conf.d/default.conf

    • 添加https项目:包括域名、根目录、证书、证书key
      server {
          listen 443 ssl http2;
          server_name  www.fastcats.top;
          root         /opt/www;
      
          ssl on;
          ssl_certificate "/etc/letsencrypt/live/www.fastcats.top/fullchain.pem";
          ssl_certificate_key "/etc/letsencrypt/live/www.fastcats.top/privkey.pem";
          ssl_session_cache shared:SSL:10m;
          ssl_session_timeout  10m;
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
          ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH';
          ssl_prefer_server_ciphers on;
          
      }
      
      • 参数解释
        • ssl on;
          • 开启ssl加密传输功能
        • ssl_certificate 'xxx'
          • 指定证书路径
        • ssl_certificate_key 'xxx'
          • 指定证书密钥路径
        • ssl_session_cache shared:SSL:10m;
          • 开启会话缓存复用
            • 指定为共享模式,存储桶大小为10MB
            • 作用: 避免每一次https请求都要创建TLS并握手交换包,造成资源浪费,这里指定缓存session,只要客户端带上此session,nginx就能认出来,迅速恢复会话,无需再创建完整的TLS
            • 性能可提升40%
        • ssl_session_timeout 10m;
          • 某一个会话缓存的过期时间
            • 这里是10分钟,可以加大到60分钟
        • ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
          • 可选的ssl加密协议
            • 这里都是新的TLS系列(传输层安全协议)
              • 从1到1.1到1.2均可选
              • 2023年更新: 可以支持TLS1.3,需要nginx1.13以上
            • 老旧的SSL系列(安全套接字协议)已经被弃用
        • ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH';
          • 指定加密算法组合
            • ECDHE 密钥交换算法
            • RSA 签名算法
            • AES128 对称加密算法
            • GCM-SHA256 签名算法
          • 这一项在安装后默认是ssl_ciphers HIGH:!aNULL:!MD5;
            • 这是一个宏,和openssl的版本相关
            • 可用openssl ciphers -V 'HIGH:!aNULL:!MD5'查询出具体的算法组合
            • 由于CBC相关的加密不安全,所以上面会指定用GCM,如果使用宏,可以改成如下RC4:HIGH:!aNULL:!MD5,告知偏向于使用RC4系列的加密算法
        • ssl_prefer_server_ciphers on;
          • 表示使用服务器端的首选算法
  • 检查文件是否书写正确 nginx -t

    • 会报错误行数和变量
  • 重启nginx服务 systemctl restart nginx

  • 证书3个月过期,所以需要强制续期并重启nginx

    • (手动)
      certbot renew --force-renew
      
      nginx -s reload
      
    • (定时自动)使用cron作业,需要crontab里面配置如下行:
      # 每月的 1号, 4点30 更新证书
      30 4 1 * * /usr/local/bin/certbot renew -q
      # 每月的 1号, 5点30 重新启动 nginx 服务器
      30 5 1 * * /usr/local/sbin/nginx -s reload