前言/絮叨
一年半以前曾经买过一个廉价的https/ssl证书,部署在本博客blog.path8.net上,时间大概在 2015-5-17,然而并没有正式启用,以至于过期也都没有注意。前几天想于把这个事情搞起来。以前的经验是,廉价ssl证书都是只对一个域名有效,但竟然发现Let's Encrypt的免费证书,还是多域名的。近一年的新文章里,有不少人对之大加赞扬;于是准备试试。同时也发现了腾讯云也有免费ssl证书,单域名的,免费一年,试用了一下,签发速度比较快,部署到本站上。不过还是决定使用Let's Encrypt。下面是简单记录。
CentOS + Nginx 环境下的部署
vps环境CentOS 6.x, niginx
ssh登录到服务器上操作,并且操作需要需要root权限。
1. 自动部署脚本需要epel源,如果之前没有安装先安装之 yum install epel-release
2. 在线获取签署脚本(按自己的习惯保存到合适目录)。签署脚本官方称之为客户端,有多个版本,这里使用的官方推荐的 certbot
wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto
3. 运行签署脚本。脚本里注意两人参数 -w, -d,分别是一个web目录及该目录对应的域名;多组目录就多次指定。这里只是获得证书文件,不做自动部署。(猜测是因为该脚本不支持nginx的自动部署,毕竟nginx不在centos官方源里,不同服务器上安装方式 不一样)。如下所示。
./certbot-auto certonly --webroot \ -w /var/www/html/blog.path8.net/html -d blog.path8.net \ -w /var/www/html/www.path8.net/html -d www.path8.net -d path8.net -d fengyqf.com
4. 接下来会自动通过yum安装几个依赖包,同意即可。
5. 然后是几步交互式对话:邮箱地址、同意条款、照着操作即可。因为Let's Encrypt是自动签署,速度非常快,大概整个过程只花费了两三分钟(包括交互过程里等待用户操作的时间)。
使用国内dns服务(如dnspod)很容易引发域名解析失败,可以用 he.net 的免费解析服务。成功后消息如文后。
在目录里 /etc/letsencrypt/live/{your.domain.ext}/ 得到四个文件:cert.pem chain.pem fullchain.pem privkey.pem 。简单理解,前两个是给Apache用的,后两个是给Nginx用的。(注意 privkey.pem 这个文件是私钥,内容千万要保密!)
事实上这四个文件是到/etc/letsencrypt/archive/{your.domain.ext}/ 下文件的符号链接。从结构上看,更新证书时,会自动更新符号链接目标。
按脚本执行的输出,运行日志记录在 Saving debug log to /var/log/letsencrypt/letsencrypt.log
下面是签署脚本成功执行后的消息。
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/blog.path8.net/fullchain.pem. Your cert will expire on 2017-01-14. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - If you lose your account credentials, you can recover through e-mails sent to f***@gmail.com. - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - 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
6. 部署证书文件到nginx上。主要是ssl_* 的行,指定为证书路径。
server { listen 80; listen 443 ssl; ssl_certificate /{your-path-to}/fullchain.pem; ssl_certificate_key /{your-path-to}/privkey.pem; ssl_session_timeout 5m; ssl_protocols TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ...... }
7. 重新加载nginx配置 nginx -s reload ,或者重启nginx,然后测试https访问。记得iptables放行443端口。
8. 如果需要,将http请求301重定向到https.
9. 配置定时任务以自动更新证书。重新签署证书及加载证书,将脚本加入到定时任务中,/path/to/certbot-auto renew --quiet . 重新加载nginx配置以应用新证书的脚本如 nginx -s reload
测试ssl/https安全评级
第三方工具:https://www.ssllabs.com/ssltest/
服务器迁移至CentOS7及域名增减
2018/12/15 更新
网站服务器搬迁,从原来的centos 6升级到7,所以参考 https://certbot.eff.org/lets-encrypt/centosrhel7-nginx 的说明,centos 7下certbot安装更简单了。
yum -y install yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional yum install python2-certbot-nginx
迁移原服务器上/etc/letsencrypt/下几个目录到新服务器上:
/etc/letsencrypt/accounts /etc/letsencrypt/archive /etc/letsencrypt/csr /etc/letsencrypt/keys /etc/letsencrypt/live /etc/letsencrypt/renewa
然后让nginx正常运行。修改证书关联的域名
certbot --nginx certonly --cert-name blog.path8.net -d blog.path8.net,www.path8.net,a.path8.net,...
其中 --cert-name 参数是指定证书主域名,-d 参数是修改后的域名列表
更新证书,并在更新完成后自动执行脚本。比如分发ssl证书、重加载nginx等,可以放到crontab里实现自动化
certbot renew --deploy-hook /root/script/renew_nginx_ssl.sh