Let’ s Encrypt 是一个免费的 SSL/TLS 证书发行机构, 证书有效期为90天, 到期前30内可续期, 实现永久免费.

本次安装使用的服务器配置:
DigitaIOcean VPS + CentOS 7 + Nginx 1.9.12

Let’ s Encrypt SSL 证书的的获取并不是像其他网站一样, 在页面上填写资申请证书, 而是需要在域名所在的服务器上安装一个客户端(python写的)去获取证书和续期.

使用 Certbot 客户端

Certbot 客户端是现在官方推荐的客户端

certbot 官网

客户端安装

yum install certbot

 

获取证书

申请过程中要验证绑定的域名是否属于申请人, 其原理就是申请人在域名所在的服务器上申请证书, 然后 Let’ s Encrypt 会访问绑定的域名与客户端通信成功即可通过.

这 个验证的方法有两种, 一种需要停止当前的 web server 服务, 让出 80 端口, 由客户端内置的 web server 启动与 Let’ s Encrypt 通信. 另一种不需要停止当前 web server , 但需要在域名根目录下创建一个临时目录, 并要保证外网通过域名可以访问这个目录.

*** 注意:先保证所有域名通过http 80协议可以访问/usr/share/nginx/html下web

#创建临时目录,可能要修改nginx rewrite 规则才能从外网访问
mkdir -p /usr/share/nginx/html/.well-known/acme-challenge
 
#--webroot 参数:指定使用临时目录的方式. -w 参数:指定后面-d 域名所在的根目录, 如果一次申请多个域的, 可以附加更多 -w...-d... 这段.
certbot certonly --webroot --email admin@itnmg.net -w /usr/share/nginx/html -d blog.itnmg.net -d itnmg.net -d www.itnmg.net

 

执行此命令后会生成证书, 保存在 /etc/letsencrypt/live 中对应的域名目录下面, 其实这里面并不是真正的证书文件,而是通过链接的形式链到了 /etc/letsencrypt/archive 中对应的域名目录下.

证书自动续期

renew 参数是官方推荐的续期方式, 使用这个参数会遍历 /etc/letsencrypt/live 下所有的证书, 如果证书在可续期的时间范围内(过期前30天内), 就会申请新的证书并替换原有证书, 否则跳过.

2
3
4
5
#使用 --dry-run 参数测试续期命令, 使用这个参数并不会真正续期证书
certbot renew --dry-run
 
#正式续期证书
certbot renew

 

设置定时自动续期,可以将 certbot renew 命令加入到 cron 中定时执行

2
#--quiet 参数表示禁止输出除了错误信息以外的任何信息
certbot renew --quiet

加入定时任务中 /etc/crontab

我这里设置为每月28号23点执行此脚本. 更新证书后重启 nginx.

#分 时 日 月 星期 执行用户 执行命令
0 23 28 * * root certbot renew --quiet && systemctl restart nginx

保存退出

2
3
4
5
#加载定时任务, 使之生效
crontab /etc/crontab
 
#查看任务
crontab -l

 

配置 Nginx SSL 证书

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

找到 SSL 证书对应域名的 Server 段, 修改为如下设置(根据自身需求做调整)

#设置非安全连接永久跳转到安全连接
server{
    listen 80;
    server_name blog.itnmg.net *.blog.itnmg.net itnmg.net www.itnmg.net;
    #告诉浏览器有效期内只准用 https 访问
    add_header Strict-Transport-Security max-age=15768000;
    #永久重定向到 https 站点
    return 301 https://$server_name$request_uri;
}
server {
    #启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复.
    listen 443 ssl http2;
    server_name blog.itnmg.net *.blog.itnmg.net itnmg.net www.itnmg.net;
    #告诉浏览器当前页面禁止被frame
    add_header X-Frame-Options DENY;
    #告诉浏览器不要猜测mime类型
    add_header X-Content-Type-Options nosniff;
    root /usr/share/nginx/html/wordpress;
 
    #证书路径
    ssl_certificate /etc/letsencrypt/live/itnmg.net/fullchain.pem;
    #私钥路径
    ssl_certificate_key /etc/letsencrypt/live/itnmg.net/privkey.pem;
    #安全链接可选的加密协议
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #可选的加密算法,顺序很重要,越靠前的优先级越高.
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:HIGH:!RC4-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
    #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法.
    ssl_prefer_server_ciphers on;
    #储存SSL会话的缓存类型和大小
    ssl_session_cache shared:SSL:10m;
    #缓存有效期
    ssl_session_timeout 60m;
 
    #省略后面与证书无关的设置
}

保存配置, 重新加载 Nginx 配置或重启.

到这步, Nginx 的 SSL 证书就配置完成了, 打开浏览器访问网站就会启用 https, 看到绿色安全锁的图标.

规范页面中的链接

如果你发现浏览器中的安全锁上带有叹号, 说明页面中引用到了非 https 的链接, 你可能要花上一点时间来修改这些链接, 如果是本站资源, 可以使用相对地址, 如果是外部资源, 要先看外部资源是否支持 https, 如果支持改为 https 地址即可,如果不支持则要想办法替换为 https 资源或将资源保存到本地并使用相对地址.