使用Let’s Encrypt为网站加上HTTPS

5.3k PHP教程 , 3评论

如何让自己的网站免费从HTTP升级为HTTPS?

本文就介绍使用 Let’s Encrypt的免费证书让网站升级为HTTPS。

作为一个博客,自然不想让在被别人浏览的时候,出现莫名的广告(运营商劫持)。

这时候,HTTPS的价值就体现出来了。

HTTPS的好处还有很多,但单单这一条,就够我花心思去升级了。

1 Let’s Encrypt 简介

如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA) 处获取一个证书,Let’s Encrypt 就是一个 CA。

我们可以从 Let’s Encrypt 获得网站域名的免费的证书。

2 Certbot 简介

Certbot 是Let’s Encrypt官方推荐的获取证书的客户端,可以帮我们*自动*获取免费的Let’s Encrypt 证书。

Certbot 是支持所有 Unix 内核的操作系统的,个人博客的服务器系统是CentOS 7。

这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。

3 获取免费证书

  1. 安装Certbot客户端
$ yum install certbot                          # CentOS
$ apt-get update && apt-get install certbot    # Ubuntu
$ apk add --no-cache certbot                   # 用Docker alpine:nginx构建的容器
  1. 获取证书
certbot certonly --webroot -w /var/www/html/awaimai -d awaimai.com -d garymeng.com

这个命令会为 awaimai.comgarymeng.com 这两个域名生成一个证书。

使用--webroot 模式会在/var/www/awaimai中创建.well-known 文件夹。

这个文件夹里面包含了一些验证文件,certbot 会通过访问 example.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器。

证书生成完毕后,我们可以在/etc/letsencrypt/live/目录下看到对应域名的文件夹,里面存放了指向证书的一些快捷方式。

当然,我们也可以用--config-dir指定证书保存的路径:

certbot certonly --webroot -w /var/www/html/awaimai -d awaimai.com -d garymeng.com --config-dir /etc/nginx/conf.d/certs

certbot提供很多的参数可以用,可参考这里

  1. 3 standalone模式

这个命令在大多数情况下都可以满足需求。

但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 –webroot 就走不通了。

certbot 还有另外一种模式--standalone , 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。

我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。

certbot certonly --standalone -d example.com -d www.example.com

这时候我们的第一生成证书已经完成了,接下来就是配置我们的web服务器,启用HTTPS。

4 Nginx 配置启用 HTTPS

博客系统使用的是Nginx 服务器来转发请求,这里贴一下我的Nginx配置。

server {
        listen 80;
        server_name garymeng.com awaimai.com;
        rewrite ^(.*) http://garymeng.com$1 permanent;
}

server {
        listen       443 ssl;
        ssl          on;
        server_name  garymeng.com;
        root         /var/www/html/awaimai;
        index        index.php;

        ssl_certificate /etc/nginx/conf.d/certs/live/awaimai.com/fullchain.pem;
        ssl_certificate_key /etc/nginx/conf.d/certs/live/awaimai.com/privkey.pem;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    
        location ~ /\.ht {
            deny all;
        }

}

主要是监听 443 端口,启用 SSL,并配置 SSL 的证书路径(公钥,私钥的路径)。
通过这些配置 我们就已经成功的完成了 Https 的启用。
现在打开我的博客 http://garymeng.com/ 就可以看到标有 安全 的字样。

5 自动更新 SSL 证书

配置完这些过后,我们的工作还没有完成。

Let’s Encrypt 提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书。

如果使用Docker容器,请参考文章《Docker使用cron定时任务

certbot 给我们提供了一个很方便的命令,那就是

certbot renew                                        # 使用【默认配置目录】的更新命令
certbot renew --config-dir /etc/nginx/conf.d/certs   # 使用【自定义配置目录】的更新命令

通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。

注意:更新完成后需要重启Nginx:nginx -s reload

我们可以运行这个命令测试一下

certbot renew --dry-run

如果运行的时候出现了这个错误:

Attempting to renew cert from /etc/letsencrypt/renewal/api.diamondfsd.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.

这是因为生成证书的时候使用的是 --standalone 模式。

这个模式在验证域名的时候,需要启用443端口,这个错误的意思就是,要启用的端口已经被占用了。

这时候必须把nginx先关掉,才可以成功。所以,先:

nginx -s stop

运行这个命令,就没有报错了,所有的证书都刷新成功。

证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。

这件事情就可以直接交给定时任务来完成。

linux 系统上有 cron 可以来搞定这件事情。

新建了一个文件 certbot-auto-renew-cron,写上 cron 计划:

15 2 * */2 * certbot renew --pre-hook "nginx -s stop" --post-hook "nginx -s start"  # standalone模式
15 2 * */2 * certbot renew --post-hook "nginx -s reload"                            # 非standalone模式

这段内容的意思就是:每隔 两个月的 凌晨 2:15 执行更新操作。

  • --pre-hook 表示执行更新操作之前要做的事情。--standalone模式的证书需要停止 nginx 服务,解除端口占用。
  • --post-hook 表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用

最后我们用 crontab 来启动这个定时任务

crontab certbot-auto-renew-cron

至此,整个网站升级到HTTPS就完成了。 总结一下我们需要做什么

  1. 获取Let’s Encrypt 免费证书
  2. 配置Nginx开启HTTPS
  3. 定时刷新证书

6 删除证书

删除所有证书:

$ sudo certbot delete

删除指定证书:

$ sudo certbot delete --cert-name example.com

删除指定目录下的指定证书:\

$ certbot delete --cert-name example.com --config-dir /etc/nginx/conf.d/ssl

 

原文地址:

  1. Let’s Encrypt 使用教程,免费的SSL证书,让你的网站拥抱 HTTPS

3 条评论

G
Guangyu says: 回复

通过nginx -s reload可能更好些,能启到重新加载证书的效果,但不会暂停nginx导致正在进行中的链接断开。

歪麦 says: 作者

同意

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

昵称 *