使用Let’s Encrypt免费SSL证书 ubuntu 教程


1. 生成证书

1.1 安装 certbot

#安装到 /usr/local 目录中
cd /usr/local
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

1.2 生成证书

# 注意此处 mysite.com 和 www.mysite.com 在 /www/mysite.com 目录
# wx.mysite.com 在 /www/wx.mysite.com 中
# 可以根据情况增删目录

./certbot-auto certonly --webroot -w /www/mysite.com -d mysite.com -d www.mysite.com -w /www/wx.mysite.com -d wx.mysite.com

安装前保证域名能正常访问。如果生成不成功,去google错误信息。

1.3 证书更新

现在证书已经有了。但是Let’s Encrypt免费SSL证书每90天要自动续期。

更新的命令是

/usr/local/certbot-auto renew --quiet --no-self-upgrade

可以用 crontab 定时更新

# 编辑 crontab
crontab -e

在定时任务中增加

# 每隔两个月1号的零点就会自动更新证书,5分钟后nginx重新加载配置。

00 00 1 2,4,6,8,10,12 * /usr/local/certbot-auto renew --quiet --no-self-upgrade
05 00 1 2,4,6,8,10,12 * /usr/sbin/service nginx -s reload

2. 配置nginx

certbot 自动生成的证书保存在/etc/letsencrypt/live/mysite.com/目录。

配置nginx的时候,修改原来的配置文件

server {
    listen  80;
    server_name  mysite.com www.mysite.com;
    location /.well-known/acme-challenge {
        location your/site;
    }
    location / {
        return 301 https:$host$request_uri;
    }

}

certbot-auto renew 的时候会访问 /.well-known/acme-challenge 目录验证网站所有权,但是这个请求不支持https!因此保留http访问方式。
并新增一段server配置

server{
    listen 443 ssl;

    ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;    

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;

    # 以下与原来的配置相同
    # ...
}

修改后重启nginx。

3. 其他设置

如果启用了防火墙,确保开启443端口。

我在这里遇到了端口被占用的情况,发现是ssserver 占用了443端口(原来的默认端口容易被封)。修改了ssserver端口,重启nginx,网站已经自动跳转到https了。

备注

如果是别的系统,也不麻烦,参看这里:https://letsencrypt.org/getting-started/,查找对应系统的生成方法。

删除的方法

如果一个域名已经不需要SSL证书了,删除略麻烦。
先备份

sudo cp /etc/letsencrypt/ /etc/letsencrypt.backup -r

再删除这三处相应的文件

rm -rf /etc/letsencrypt/live/${DOMAIN}
rm -rf /etc/letsencrypt/renewal/${DOMAIN}.conf
rm -rf /etc/letsencrypt/archive/${DOMAIN}