Let’s Encrypt证书快速申请并自动续期

Mozilla、思科、Akamai、IdenTrust、EFF和密歇根大学研究人员宣布了Let’s Encrypt CA项目,为网站提供免费SSL证书,加速网站从HTTP升级到HTTPS的进程。最近开始了任何人都可以参加的公测,之前需要邀请码。现在将过程记录下来以供参考。

 本站在使用香港沙田CN2主机过程中时常会发生signed.pem内容为空的情况,建议大家及时备份一下已签发证书并进行监控,以防证书更新不成功导致站点访问不正常的情况 

文章及代码都修改自:https://github.com/diafygi/acme-tiny

重要:不要使用国内的DNS解析,否则无法验证域名。截至2015年12月6日,已经验证不可用的:HiChina, DNSpod, Cloudxns via https://www.v2ex.com/t/230100,不排除这些运营商将来解决这个问题。我自己用dns.he.net的进行验证成功。

基本设置生成account.key, domain.key and dhparam.pem

# All codes modify from https://github.com/diafygi/acme-tiny 
# A base dir for everything,根目录
mkdir /var/ssl/yourdomain/
cd /var/ssl/yourdomain/
# Generate account.key, domain.key and dhparam.pem,生成account.key, domain.key and dhparam.pem三个文件
openssl genrsa 2048 > account.key
openssl genrsa 2048 > domain.key
openssl dhparam -out dhparam.pem 2048
# Generate domain.csr,生成domain.csr
openssl req -new -sha256 -key domain.key -subj "/CN=www.yourdomain.com" > domain.csr

设置网站文件供脚本写入文件验证域名

我用的是Nginx作为前端,在文件中添加:

server {
    listen 80;
    server_name yoursite.com, www.yoursite.com;

    location /.well-known/acme-challenge/ {
        alias /var/www/yourdomain/;
        try_files $uri =404;
    }

    #The rest of your Nginx config,你其余的Nginx配置文件
}

获取acme-tiny脚本,自动进行注册账号,验证域名及签发证书

# Install git if you haven't,安装所需的git工具
apt-get install git 
# Clone acme-tiny,获取Let's Encrypt申请脚本
git clone https://github.com/diafygi/acme-tiny.git
cd /var/ssl/yourdomain/acme-tiny/
# Register account, verify the domain and sign the certificate,自动进行注册账号,验证域名及签发证书
python acme_tiny.py --account-key /var/ssl/yourdomain/account.key --csr /var/ssl/yourdomain/domain.csr --acme-dir /var/www/yourdomain/ > /var/ssl/yourdomain/signed.crt
# Get and combine the intermediate into chained.pem,获取并合并证书
cd /var/ssl/yourdomain/
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

设置网站文件添加SSL证书并启用HTTPS访问

server {
    listen 443;
    server_name yoursite.com, www.yoursite.com;

    ssl on;
    ssl_certificate /var/ssl/yourdomain/chained.pem;
    ssl_certificate_key /var/ssl/yourdomain/domain.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_dhparam /var/ssl/yourdomain/dhparam.pem;
    ssl_prefer_server_ciphers on;

    #The rest of your Nginx config,你其余的Nginx配置文件
}

如果只需要443端口,那么就注释掉80端口的监听语句,并且用下面语句进行跳转

#For redirect to https,跳转到带证书的主域名
server {
        server_name yoursite.com, www.yoursite.com;
        rewrite ^(.*) https://www.yoursite.com$1 permanent;
}

自动续期证书脚本

建立一个renew_cert.sh,其实就是上面步骤的命令合体。路径还是/var/ssl/yourdomain/

#!/usr/bin/sh
cd /var/ssl/yourdomain/acme-tiny/
# Register account, verify the domain and sign the certificate,自动进行注册账号,验证域名及签发证书
python acme_tiny.py --account-key /var/ssl/yourdomain/account.key --csr /var/ssl/yourdomain/domain.csr --acme-dir /var/www/yourdomain/ > /var/ssl/yourdomain/signed.crt
# Get and combine the intermediate into chained.pem,获取并合并证书
cd /var/ssl/yourdomain/
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
service nginx reload

建立Cron任务:

# example line in your crontab (runs once per month)
0 0 1 * * bash /var/ssl/yourdomain/renew_cert.sh 2>> /var/log/acme_tiny.log
# restart Nginx to load the new certificate
10 0 1 * * /etc/init.d/nginx restart

每月更新一次,续期脚本结果作为日志输出在/var/log/acme_tiny.log

权限及安全

原文章里作者提了安全及权限事项,大家一定要遵照。原文作者的建议是专门创建一个新用户,权限仅限于私钥,脚本及challenge文件夹。允许次用户写入存放网站证书的路径(本例中是/var/ssl/yourdomain/)和重启网页服务器(nginx)。

  • 备份好私钥(e.g. account.key)
  • 不要让这个脚本有读域名私钥的权限
  • 不要用root权限来运行此脚本

参考资料

启用HTTPS访问和HTTP/2的好处在于防止运营商劫持插入广告,加快网站载入速度。这是未来互联网的趋势,建议大家尽快部署。

天毅

Linux/php菜鸟,喜欢修修补补,喜欢分享,喜欢写博客,其实主要是喜欢找速度快的国外空间(剁手癌晚期,买VPS完全停不下来)...

8 thoughts to “Let’s Encrypt证书快速申请并自动续期”

  1. 你好,我使用你站内的lnmp脚本搭的wp,签好let’sencrypt证书,修改wp的nginx配置文件添加了”listen443;ssl on;ssl_certificate /example;ssl_certificate_key /example;”这些字段,之后,就无法重启nginx了,想请教下还需要怎么做

    1. 用这个脚本实测不需要暂停Nginx运行(只有200行代码没有任何依赖库),好像用客户端的时候要独占端口,但是客户端可以改非80端口。

发表评论

电子邮件地址不会被公开。 必填项已用*标注