文档章节

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

DiamondFsd
 DiamondFsd
发布于 2017/01/23 10:12
字数 1441
阅读 6989
收藏 666

这篇文章主要讲的就是如何让自己的网站免费从HTTP升级为HTTPS,使用的是 Let's Encrypt的证书。实际上也就是一个Let's Encrypt 免费证书获取教程 。 为什么要上HTTPS,说一个小故事。

从前有个网站,后来有个广告,没了

作为一个博客,自然不想让在被别人浏览的时候,出现莫名的广告(运营商劫持)。这时候,HTTPS的价值就体现出来了。 HTTPS的好处还有很多,但单单这一条,就够我花心思去升级了。 (其实主要目的是提升网站Biger :)

Let's Encrypt 简介

如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA) 处获取一个证书,Let's Encrypt 就是一个 CA。我们可以从 Let's Encrypt 获得网站域名的免费的证书。这篇文章也主要讲的是通过 Let's Encrypt + Nginx 来让网站升级到HTTPS。

Certbot 简介

Certbot 是Let's Encrypt官方推荐的获取证书的客户端,可以帮我们获取免费的Let's Encrypt 证书。Certbot 是支持所有 Unix 内核的操作系统的,个人博客的服务器系统是CentOS 7,这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。

获取免费证书

  1. 安装Certbot客户端
yum install certbot
  1. 获取证书
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com

这个命令会为 example.com 和 www.example.com 这两个域名生成一个证书,使用 --webroot 模式会在 /var/www/example 中创建 .well-known 文件夹,这个文件夹里面包含了一些验证文件,certbot 会通过访问 example.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器。这个命令在大多数情况下都可以满足需求,

但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 --webroot 就走不通了。certbot 还有另外一种模式 --standalone , 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。

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

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

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

Nginx 配置启用 HTTPS

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

    server {
        server_name diamondfsd.com www.diamondfsd.com;
        listen 443;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/diamondfsd.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/diamondfsd.com/privkey.pem;

        location / {
           proxy_pass http://127.0.0.1:3999;
           proxy_http_version 1.1;
           proxy_set_header X_FORWARDED_PROTO https;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;
        }
    }
    server {
        server_name api.diamondfsd.com;
        listen 443;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/api.diamondfsd.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/api.diamondfsd.com/privkey.pem;

        location / {
           proxy_pass http://127.0.0.1:4999;
           proxy_http_version 1.1;
           proxy_set_header X_FORWARDED_PROTO https;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;

        }
    }

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

alt

自动更新 SSL 证书

配置完这些过后,我们的工作还没有完成。 Let's Encrypt 提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书,certbot 给我们提供了一个很方便的命令,那就是 certbot renew
通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。
我们可以运行这个命令测试一下

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.

alt
这是因为我的api.diamondfsd.com生成证书的时候使用的是 --standalone 模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把nginx先关掉,才可以成功。果然,我先运行 service nginx stop 运行这个命令,就没有报错了,所有的证书都刷新成功。

证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。 这件事情就可以直接交给定时任务来完成。linux 系统上有 cron 可以来搞定这件事情。
我新建了一个文件 certbot-auto-renew-cron, 这个是一个 cron 计划,这段内容的意思就是 每隔 两个月的 凌晨 2:15 执行 更新操作。

15 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

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

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

crontab certbot-auto-renew-cron

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

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

鸣谢 Let's Encrypt 组织以及所有该组织的贡献者支持者 为我们提供 免费的安全证书。

参考: Certbot centosrhel7-nginx
参考: Let's Encrypt getting-startd
参考: Archlinux cron
参考: Nginx configuring-https-servers


我的个人博客

© 著作权归作者所有

共有 人打赏支持
DiamondFsd
粉丝 88
博文 15
码字总数 16372
作品 0
深圳
程序员
私信 提问
加载中

评论(35)

解永辉
解永辉

引用来自“one-way-trip”的评论

这个非得有域名才能这么做吗?如果我在本地应该怎么用,目前服务器上已经有东西在跑 ,不敢尝试啊。如何在本地挂个虚拟机然后通过你说的形式去弄啊?求指教

引用来自“解永辉”的评论

最好不要手动配置,如果前端是nginx,直接用Certbot提供的脚本安装。https://xieyonghui.com/tech/lets-encrypt_181.html
通过本地下载Certbot程序到本地,可以实现你想要的方式,不过应该没有耐心这么干。
解永辉
解永辉

引用来自“one-way-trip”的评论

这个非得有域名才能这么做吗?如果我在本地应该怎么用,目前服务器上已经有东西在跑 ,不敢尝试啊。如何在本地挂个虚拟机然后通过你说的形式去弄啊?求指教
最好不要手动配置,如果前端是nginx,直接用Certbot提供的脚本安装。https://xieyonghui.com/tech/lets-encrypt_181.html
Deepzz
Deepzz
freessl.org 申请多种免费证书,好用得很
one-way-trip
one-way-trip
这个非得有域名才能这么做吗?如果我在本地应该怎么用,目前服务器上已经有东西在跑 ,不敢尝试啊。如何在本地挂个虚拟机然后通过你说的形式去弄啊?求指教
淚痕L☆ve└ 菰l獨ズ[垨□堠
淚痕L☆ve└ 菰l獨ズ[垨□堠
哪里下载相关软件呢
又拍云
又拍云
支持楼主。Let's Encrypt的证书就是要自己写脚本,自动更新。不然三个月的有效期太短。顺便插一句:现又拍云提供免费 Let's Encrypt 证书,自助部署,到期自动续签,永久免费。另还有Symantec的免费证书,有需要的复制网址 https://www.upyun.com/https.html 到地址栏,免费申请~~
yuanjianhua77
yuanjianhua77
厉害了 我的哥
DiamondFsd
DiamondFsd

引用来自“捏造的信仰”的评论

我们半年前就已经在用了,只是因为cdn提供商要手工上传证书,所以自动更新怕是没法了。这与letsencrypt无关,用谁的证书都得这样。
要是我的话就看看供应商有没有什么API可以上传证书的。如果没有的话,就解析一下登录和上传的逻辑,然后在写个小程序做定时 就ok了
捏造的信仰
捏造的信仰
我们半年前就已经在用了,只是因为cdn提供商要手工上传证书,所以自动更新怕是没法了。这与letsencrypt无关,用谁的证书都得这样。
榕树下_
榕树下_
谢谢
最新阿里云服务器免费SSL证书配置HTTPS的两种方法(图文教程二)

在大家学习如何利用免费SSL证书配置网站HTTPS之前,我们先要搞清楚为什么要开启HTTPS,这个绿色的小锁真的有用吗?所谓的HTTPS其实是(安全套接字层超文本传输协议)是以安全为目标的HTTP通道...

点金米
2018/09/18
0
0
网站实现https 申请Let's Encrypt永久免费SSL证书

Let's Encrypt简介 Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向H...

雨季2014
2018/07/27
0
0
申请Let's Encrypt永久免费SSL证书

环境安装 1、安装git 2、安装python 系统自带 不用安装 只要版本大于2.7即可。 获取Let's Encrypt免费SSL证书 先停止nginx 在阿里云安全组里加入 443端口的入规则 第三、Let's Encrypt免费S...

HGMrWang
2018/10/20
0
0
让网站成为 HTTPS 安全站点

本文首发于我的个人博客:尾尾部落 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的...

繁著
2018/08/06
0
0
简单四步让你随时随地从外网访问家中的黑群晖(顶级域名+HTTPS+SSL证书)

PS:本文主要讲给黑群晖新手,老鸟请绕道,不知道群晖为何物的也请绕道。 正文:游魂没钱买正版的群晖,只好自己用家里的HTPC搭建了一个黑群晖,但是黑群晖从外网访问又是个难题,本文就教大...

刘宗阳博客
2018/01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java常用设计模式

设计模式; 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂。后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“...

呵呵哒灬
31分钟前
3
0
Kafka入门

1、Kafka使用背景 在我们大量使用分布式数据库、分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户的搜索关键词...

watermelon11
昨天
0
0
Cannot list resources Permission denied: user=Administrator, access=READ_EXECUTE, inode="/tmp"

Cannot list resources Permission denied: user=ÁõÎĺÁ, access=READ_EXECUTE, inode="/tmp":root:supergroup:drwx-wx-wx windows系统 Spring boot 整合hadoop时报错。 java.lang.Ille......

lwenhao
昨天
2
0
【结构型】- 享元模式

享元模式 作用:利用共享技术有效地支持大量细粒度对象的复用 享元模式状态 内部状态:在享元对象内部不随外界环境改变而改变的共享部分,存储于享元对象内部 外部状态:随着环境的改变而改变...

ZeroneLove
昨天
3
0
Vue 中使用UEditor富文本编辑器-亲测可用-vue-ueditor-wrap

一、Vue中在使用Vue CLI开发中默认没法使用UEditor 其中UEditor中也存在不少错误,再引用过程中。 但是UEditor相对还是比较好用的一个富文本编辑器。 vue-ueditor-wrap说明 Vue + UEditor + ...

tianma3798
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部