page contents

如何使用 Let's Encrypt的免费证书让网站升级为HTTPS?

或许你在一个博客上看到右下角,或者时不时的弹出广告,这种就是运营商劫持,你不想让它这样,这时候,HTTPS的价值就能表现出来了。 HTTPS的好处还有很多,但仅此这一条,就够我们花心思去升...


或许你在一个博客上看到右下角,或者时不时的弹出广告,这种就是运营商劫持,你不想让它这样,这时候,HTTPS的价值就能表现出来了。

HTTPS的好处还有很多,但仅此这一条,就够我们花心思去升级我们的博客系统了。


1 来了解一下什么是Let's Encrypt 
Let's Encrypt 就是一个 证书。

如果要启用HTTPS,我们就需要从授权机构(以下简称CA) 处获取一个证书,
而从 Let's Encrypt ,我们可以获得网站域名的免费的证书。

2 Certbot 简介
Certbot 是Let's Encrypt官方推荐的获取证书的客户端,可以帮我们自动获取免费的Let's Encrypt 证书。
Certbot 是支持所有 Unix 内核的操作系统的,本文的例子是基于CentOS 7来讲解的。


3 获取免费证书
3-1 安装Certbot客户端

$yuminstallcertbot#CentOS$apt-getupdate&&apt-getinstallcertbot#Ubuntu$apkadd--no-cachecertbot#用Dockeralpine:nginx构建的容器

3-2 获取证书

certbotcertonly--webroot-w/var/www/html/awaimai-dawaimai.com-dwww.awaimai.com

上面的这个命令行会为 awaimai.com 和 www.awaimai.com 这两个域名生成一个证书。使用--webroot 模式会在/var/www/awaimai中创建.well-known 文件夹。
此文件夹包含一些验证文件,certbot 会通过访问 example.com/.well-known/acme-challenge验证您的域有没有绑定到此服务器。


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


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

certbotcertonly--webroot-w/var/www/html/awaimai-dawaimai.com-dwww.awaimai.com--config-dir/etc/nginx/conf.d/certs

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

https://certbot.eff.org/docs/using.html#configuration-file


3-3 standalone模式

在大多数情况下,这个命令都可以满足需求。
但是有时我们的某些服务没有根目录,例如一些微服务,这时候使用 --webroot 就走不通了。


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


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

certbotcertonly--standalone-dexample.com-dwww.example.com

至此,我们的第一证书生成已完成。下一步是配置我们的Web服务器并启用HTTPS。

4 Nginx 配置启用 HTTPS
我的配置是使用的是Nginx 服务器来转发请求,这里贴一下我的Nginx配置。

server{listen80;server_namewww.awaimai.comawaimai.com;rewrite^(.*)https://www.awaimai.com$1permanent;}server{listen443ssl;sslon;server_namewww.awaimai.com;root/var/www/html/awaimai;indexindex.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_pass127.0.0.1:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;includefastcgi_params;}location~/.ht{denyall;}}

配置主要是监听 443 端口和启用 SSL,并配置了 SSL 的证书路径(公钥,私钥的路径),通过这些配置,我们就可以成功启用Https了。

你打开网站的时候就可以看到标有 安全 的字样。比如:

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


5 自动更新 SSL 证书
配置完这些后,我们的工作尚未完成。
Let's Encrypt 提供的证书只有90天的有效期,我们必须在这些证书过期之前重新获得它们。有什么办法呢?

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

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

使用此命令,他将自动检查系统中的证书并自动更新它们。
注意:更新完成后需要重启Nginx:nginx -s reload。
我们可以运行这个命令测试一下

certbotrenew--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-sstop

运行这个命令,没有报错的话,也就是所有的证书都刷新成功。证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。


当然,这种不用我们每次去更新,我们容易忘记的,可以用linux的定时任务来完成。用 crontab做一个定时任务就可以了
新建了一个文件 certbot-auto-renew-cron,写上 cron 计划:

152**/2*certbotrenew--pre-hook"nginx-sstop"--post-hook"nginx-sstart"#standalone模式152**/2*certbotrenew--post-hook"nginx-sreload"#非standalone模式

命令的意思就是:每隔 两个月的 凌晨 2:15 执行更新操作。

--pre-hook 表示执行更新操作之前要做的事情。

--standalone模式的证书需要停止 nginx 服务,解除端口占用。

--post-hook 表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用


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

crontabcertbot-auto-renew-cron

至此,整个网站升级到HTTPS就完成了。


6 删除证书
删除所有证书:

$sudocertbotdelete

删除指定证书:

$sudocertbotdelete--cert-nameexample.com

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

$certbotdelete--cert-nameexample.com--config-dir/etc/nginx/conf.d/ssl

  • 发表于 2020-02-11 15:53
  • 阅读 ( 507 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章