Centos7 配置 nginx 使用 let's Encrypt 证书

本贴最后更新于 2048 天前,其中的信息可能已经天翻地覆

Centos7 配置 nginx 使用 let's Encrypt 证书

let’s Encrypt 提供的免费的 ssl 证书申请流程已经非常简便,使用度也非常高。证书的申请方法有很多中,这里记录最简单的一种。let’s Encrypt 免费证书有效期 90 天,续用更新会相应减少期限,各种续期提醒会准时发送邮件到域名配置的邮箱

流程及注意

有些 let’s Encrypt 证书安装方法需要用到 python2.7 及以上,centos6 默认是 python2.6 版本,需要做相应升级。centos7 可以直接跳过。

申请证书之前如果 80 或 443 端口被监听,例如 nginx 已经在使用,就必须把 nginx 停掉,不然会申请失败。

安装过程超简单

先下载 let’s Encrypt 指定的安装控件

git clone https://github.com/letsencrypt/letsencrypt


有可能会遇到报错,多是源或者网络的问题,按报错信息基本能自行解决

cd letsencrypt

./letsencrypt-auto certonly --standalone --email xxx@xxx.org -d xxx1.org -d xxx2.org

其中 email 填入邮箱,-d 填入有效域名,可单个可多个

./letsencrypt-auto 可以有其他指令操作,可以--help 查看

申请指令执行后会自动更新环境需要的各种依赖,当然也有跳过的参数,日志中有提示--no-bootstrap

然后简单的手动同意流程

当看到- Congratulations!开头的一段日志就 OK 了。

 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/pushweb.onethird.com.cn/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/pushweb.onethird.com.cn/privkey.pem
   Your cert will expire on 2018-07-26. To obtain a new or tweaked
   version of this certificate in the future, simply run
   letsencrypt-auto again. To non-interactively renew *all* of your
   certificates, run "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le
server {
    listen 80;
    server_name pan.isuanyun.com;
    add_header Strict-Transport-Security max-age=15768000;
    rewrite ^(.*) https://$server_name$1 permanent;
}
openssl dhparam -out dhparam.pem 2048

因为是外网服务器,偶尔会有访问不通的情况,多试几次或者换一个时间段试。

证书申请成功之后在/etc/letsencrypt/live/下会生成相应文件

|-- /etc/letsencrypt/live/
   |--域名
       |-- cert.pem  - Apache服务器端证书
       |-- chain.pem  - Apache根证书和中继证书
       |-- fullchain.pem  - Nginx所需要ssl_certificate文件
       |-- privkey.pem - 安全证书KEY文件

主要用到 fullchain.pem,privkey.pem 两个文件

nginx 主要配置

server{
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name images.isuanyun.com;
	ssl_certificate /etc/letsencrypt/live/images.isuanyun.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/images.isuanyun.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/letsencrypt/live/images.isuanyun.com/dhparam.pem;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;
    location / {
            resolver 114.114.114.114 valid=5s;
            set $upstream "http://centrexzj.vicp.cc:13013";
            index  index.html index.php;
            proxy_buffers   32 64k;  
            proxy_busy_buffers_size 256k;  
            proxy_set_header       Host $host;  
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
            proxy_set_header X-Forwarded-Proto  $scheme;  
            client_max_body_size 100m;  
            proxy_connect_timeout 360;  
            port_in_redirect off;  
            real_ip_header X-Forwarded-For;   
            proxy_pass http://tu_server; #映射子域名到对应的后端请求  			
    }
}

再刷新 nginx 配置

service nginx reload

证书更新

在 let’s Encrypt 安装目录下

./certbot-auto renew --force-renew

有可能会提示 python 版本问题,如果是 python2.7 以下的就需要升级,注意重新配置 2.6 的引用,不然命令行会失效

证书自动续期

证书续期的命令如下:

./letsencrypt-auto renew

如果要指定更新某个域名的证书, 则要使用 certonly 参数, 其实和新申请证书时的命令差不多.

./letsencrypt-auto certonly --standalone --email m19923251012@163.com -d pan.isuanyun.com

通过 cron 运行脚本的方式可以实现定时续期, 官方提供了脚本示例. https://letsencrypt.org/getting-started/ 最下面

最终脚本如下:

#!/bin/sh
#停止 nginx 服务,使用 --standalone 独立服务器验证需要停止当前 web server.
systemctl stop nginx
if ! /root/letsencrypt/letsencrypt-auto renew -nvv --standalone > /var/log/letsencrypt/renew.log 2>&1 ; then
    echo Automated renewal failed:
    cat /var/log/letsencrypt/renew.log
    exit 1
fi
#启动 nginx
systemctl start nginx

将这段脚本保存为 letsencrypt-renew.sh

添加可执行权限

chmod a+x letsencrypt-renew.sh

编辑 crontab 配置文件或执行 crontab -e 添加 cron 任务

vim /etc/crontab

我这里设置为每月 28 号 23 点执行此脚本.

#分 时 日 月 星期 执行用户 执行命令
0 23 28 *  *   root    /root/letsencrypt/letsencrypt-renew.sh

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 35 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 492 关注
  • 证书
    11 引用 • 41 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    openssl dhparam -out dhparam.pem 2048

  • someone

    docker run --detach --hostname xxx.com --publish 443:443 --publish 80:80 --publish 2222:22 --name gitlab --restart always -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest