HPPTS 背景知识简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程

本文内容较长,但是包含一些背景知识、基本概念的介绍和完整的实操过程,一步步照着做的话,应该都可以一次过关配置成功。不需要了解背景知识的同学可以直接跳到实操过程,六小步即可完成使用 Let’s Encrypt 官方工具 Certbot 配置 SSL 安全证书的过程。


♦背景知识

1、http 和 https 是什么?

简单地说,http 是一个传输网页内容的协议,比如你看到的 http 开头的网站 http://news.163.com,其网页上的文字、图片、CSS、JS 等文件都是通过 http 协议传输到我们的浏览器然而让我们看到滴。

http-https

而 https 可以理解为 “HTTP over SSL/TLS”,好端端的 http 为什么需要 “over SSL/TLS”呢,因为 http 是明文传输,通过 http 协议传输的内容很容易被偷看和篡改,为了安全(你肯定不想被人偷看或者篡改网页内容吧,比如网站银行密码什么的),就为 http 协议再加上了一层 SSL/TLS 安全协议,所以就变成了 https。

 

2、SSL/TLS 是什么?

“HTTP over SSL/TLS” 其字面意思就是带“安全套接层”的 http 协议,内心纯洁的同学也可以理解为“带安全套的 http”,因为带了安全套的 http 当然会比较安全(/(ㄒoㄒ)/~~),其中 SSL 是 “Secure Sockets Layer” 的缩写,是“安全套接层”的意思,TLS 是 “Transport Layer Security” 的缩写,是”传输层安全协议”的意思。SSL 和 TLS 是同一个东西的不同阶段,理解为同一个东西也行,都是安全协议就对了。

enabling-ssl-https

 

3、为什么要部署 https?

说到底,就是 https 更安全,甚至为了安全,一个专业的可靠的网站,https 是必须滴。Firefox 和 Chrome 都计划将没有配置 SSL 加密的 http 网站标记为不安全(貌似我的 Firefox 50 已经这么干了),虽然很残忍,但是我绝对是举双手赞成滴。目前它们也正在联合很多相关的基金会与公司推动整个互联网 https 普及化,现在大家访问的一些主要的网站包括 Google 多年前就已经全部启用 https ,国内的淘宝、搜狗、知乎、百度等等也全面 https了。甚至 Google 的搜索结果也正在给予 https 的网站更高的排名和优先收录。

 

4、怎么部署 https 呢?

其实你只需要有一张被信任的 CA (Certificate Authority)也就是证书授权中心颁发的 SSL 安全证书,并且将它部署到你的网站服务器上,部署成功后,当用户访问你的网站时,浏览器会在显示的网址前加一把小绿锁,表明这个网站是安全的,当然同时你也会看到网址前的前缀是 https,不再是 http 了。譬如下图的PayPal:

httpvshttps

 

5、怎么获得 SSL 安全证书呢?

理论上,我们自己也可以签发 SSL 安全证书,但是我们自己签发的安全证书不会被主流的浏览器信任,所以我们需要被信任的证书授权中心(CA)签发的安全证书。而一般的 SSL 安全证书签发服务都比较贵,比如 Godaddy、GlobalSign 等机构签发的证书一般都需要20美金一年甚至更贵,不过为了加快推广 https 的普及,EEF 电子前哨基金会、Mozilla 基金会和美国密歇根大学成立了一个公益组织叫 ISRG (Internet Security Research Group),这个组织从 2015 年开始推出了 Let’s Encrypt 免费证书,不仅免费,而且还相当好用,所以我们就可以利用 Let’s Encrypt 提供的免费证书部署 https。那怎么获得 Let’s Encrypt 安全证书,并且将它部署在自己的网站服务器上呢?这就是这篇文章要讲的内容了。

注:对 https 、数字证书及 CA 的工作原理感兴趣的同学可以阅读编程随想的系列文章


♦Let’s Encrypt 及 Certbot 简介

前面也已经介绍过,Let’s Encrypt 是 一个叫 ISRG (Internet Security Research Group 互联网安全研究小组)的组织推出的免费安全证书计划,参与这个计划的组织和公司可以说是互联网顶顶重要的一些先驱,除了前文提到的发起三个牛气哄哄的发起单位,后来又有思科(全球网络设备制造商执牛耳者)、Akamai加入,甚至连 Linux 基金会 也加入了合作,这些大牌组织保证了这个项目的可信度和可持续性。

lets-encrypt

虽然项目和该项目签发的证书很可信,但是一开始 Let’s Encrypt 的安全证书配置起来比较麻烦,需要手动获取及部署,有一定的门槛,没有一些技术底子可能比较难搞定,然后有一些网友就自己做了一些脚本来优化和简化部署过程,其中有一个网友 xdtianyu 做了一个可以快速获取及更新证书的  letsencrypt.sh 脚本是使用比较广的,地址如下:

https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh

首先要感谢 xdtianyu 同学的付出和努力,我之前用的也是这个脚本,不过我不知道是不是我运行地不对,虽然我顺利地按照流程装上了,但是用 SSLlabs 检测我配的网站还是不太安全,部署得不太好,并且在很多浏览器上都被标注为“不安全”,当时因为忙也没有太多时间折腾和细究,不过后来 ISRG 的发起者 EFF (电子前哨基金会)为 Let’s Encrypt 项目发布了一个官方的客户端 Certbot,可以完全自动化获取、部署及更新安全证书,非常容易、方便;所以我们就可以直接使用官方客户端,不需要再使用第三方的工具了。虽然第三方工具也可以使用,但是官方工具更权威,风险也更小,而且即使遇到问题也更容易解决,毕竟有官方的支持。何况 Certbot 确实非常方便,也比所有的第三方工具都更方便,何乐而不用呢。


♦官方客户端 Certbot  使用方法

Certbot 的官方网站是 https://certbot.eff.org/ ,打开这个链接选择自己使用的 web server 和操作系统,EFF 官方会给出详细的使用方法,如下图,不过我觉得这样还是太复杂,太麻烦,所以建议读者朋友可以不用看这个网站,按照我的方法走一遍即可。以下以本网站域名(wenqixiang.com)举例

certbot

我的运行环境:Debian 8.0 64 位(本教程同样适用于 Debian、Ubuntu、CentOS、Arch、),网页服务器用的是 Nginx 1.10,当前工作目录为 /home/wenqixiang 家目录。如果是从零开始配置服务器,推荐使用 Debian 8 + lnmp 作为网站环境。

 

1、获取 Certbot 客户端

wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
./certbot-auto --help

2、配置 nginx、验证域名所有权

在虚拟主机配置文件(/usr/local/nginx/conf/vhost/wenqixiang.com.conf)中添加以下内容,这一步是为了通过 Let’s Encrypt 的验证,验证 wenqixiang.com 这个域名是属于我的管理之下。(具体解释可见下一章“一些补充说明”的“certbot的两种工作方式”)

location ^~ /.well-known/acme-challenge/ {
   default_type "text/plain";
   root     /home/wwwroot/wenqixiang.com/;
}

location = /.well-known/acme-challenge/ {
   return 404;
}

3、重载 nginx

配置好 Nginx 配置文件,重载使修改生效(如果是其他系统 nginx 重载方法可能不同)

sudo nginx -s reload

4、生成证书

./certbot-auto certonly --webroot -w /home/wwwroot/wenqixiang.com -d  wenqixiang.com

中间会有一些自动运行及安装的软件,不用管,让其自动运行就好,有一步要求输入邮箱地址的提示,照着输入自己的邮箱即可,顺利完成的话,屏幕上会有提示信息。

此处有坑!如果顺利执行请直接跳到第五步,我在自己的服务器上执行多次都提示

connection :: The server could not connect to the client for DV :: DNS query timed out

发现问题出在 DNS 服务器上,我用的是 DNSpod,无法通过验证,最后是将域名的 DNS 服务器临时换成 Godaddy 的才解决问题,通过验证,然后再换回原来的 DNSpod。

证书生成成功后,会有 Congratulations的提示,并告诉我们证书放在/etc/letsencrypt/live 这个位置

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/wenqixiang.com/fullchain.pem. Your cert
   will expire on 2017-02-011. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.

5、配置 Nginx(修改 /usr/local/nginx/conf/vhost/wenqixiang.com.conf),使用 SSL 证书

listen 443 ssl;
server_name wenqixiang.com www.wenqixiang.com;
index index.html index.htm index.php;
root  /home/wwwroot/wenqixiang.com;
 
ssl_certificate      /etc/letsencrypt/live/wenqixiang.com/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/wenqixiang.com/privkey.pem;

上面那一段是配置了 https 的访问,我们再添加一段 http 的自动访问跳转,将所有通过 http://www.wenqixiang.com 的访问请求自动重定向到 https://wenqixiang.com

server {
    listen 80;
    server_name wenqixiang.com www.wenqixiang.com;
    return 301 https://$server_name$request_uri;
}

6、重载 nginx,大功告成,此时打开网站就可以显示绿色小锁了

sudo nginx -s reload

♦后续工作

出于安全策略,Let’s Encrypt 签发的证书有效期只有 90 天,所以需要每隔三个月就要更新一次安全证书,虽然有点麻烦,但是为了网络安全,这是值得的也是应该的。好在 Certbot 也提供了很方便的更新方法。

1、测试一下更新,这一步没有在真的更新,只是在调用 Certbot 进行测试

./certbot-auto renew --dry-run

如果出现类似的结果,就说明测试成功了(总之有 Congratulations 的字眼)

Congratulations, all renewals succeeded. The following certs have been renewed:  
   /etc/letsencrypt/live/wenqixiang.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)

 

2、手动更新的方法

./certbot-auto renew -v

3、自动更新的方法

./certbot-auto renew --quiet --no-self-upgrade


♦一些补充说明解释

1、certbot-auto 和 certbot

certbot-autocertbot本质上是完全一样的;不同之处在于运行certbot-auto会自动安装它自己所需要的一些依赖,并且自动更新客户端工具。因此在你使用certbot-auto情况下,只需运行在当前目录执行即可

./certbot-auto

 

2、certbot的两种工作方式

certbot(实际上是certbot-auto) 有两种方式生成证书:standalonewebroot

standalone方式,certbot会自己运行一个 web server来进行验证。如果我们自己的服务器上已经有 web server正在运行 (比如 Nginx 或 Apache),用 standalone 方式的话需要先关掉它,以免冲突。
webroot方式,certbot 会利用既有的 web server,在其 web root目录下创建隐藏文件,Let’s Encrypt服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权。

本文用的是 webroot 方式,也只推荐 webroot 方式,这也是前文第二步验证域名所有权在 nginx 虚拟主机配置文件中添加 location 段落内容的原因。

 

 


Certbot 常见问题答疑(翻译自https://certbot.eff.org/faq/

 

——Let’s Encrypt 的 SSL 安全证书接受度如何,我的浏览器是否会信任它?

答:绝大多数操作系统(Linux、MacOS、Windows、Android)的绝大多数浏览器(Firefox、Chrome、Safari、IE、Edge),都已经内置了相关证书,相关细节可以查看《Which browsers and operating systems support Let’s Encrypt

——什么时候可以获得Let’s Encrypt 的 SSL 安全证书?

答:马上就可以,现在安装 Certbot 官方配置工具,Let’s Encrypt 的 CA 服务已经成功了签发了数以百万计的安全证书,Certbot 正在 beta 测试阶段,但是一切运行正常,如果你在配置过程中遇到任何问题,欢迎随时回报,我们将尽快解决。

——我可以将 Certbot 签发的安全证书用于代码签名或者邮件加密吗?

答:不可以哦,邮件加密和代码签名需要的是另一种安全证书,不是 Let’s Encrypt 这一种。

 ——Certbot 会生成或者储存我的安全证书的私钥在 Let’s Encrypt 的服务器上吗?

答:不会,私钥只会在你自己的服务器上生成和管理,而不是 Let’s Encrypt 的服务器。

——Certbot 会提供 EV 增强验证 SSL 证书(Extended Validation Certificate)吗?

答:目前阶段 Certbot 和 Let’s Encrypt 暂时没有提供 EV 证书的计划。

——我可以为多个域名签发一张 SSL 证书吗?

答:可以,通过 SAN (Subject Alternative Name)方法,一张证书可以应用到多个不同域名上,Certbot 会自动为多域名请求对应的认证,在浏览器访问域名时,会检测该域名是否在该证书所包含的域名清单中。

——Certbot 支持我所使用的操作系统吗?

答:目前 Certbot 支持市面上主要的 Linux 及 BSD 操作系统及其各衍生发行版。

——Certbot 可以在服务器上自动配置吗?

答:目前 Certbot 已经支持了在很多不同操作系统和网站服务器上自动配置,而且将会支持得更多,自动配置可以帮助你更快、更容易地获得、安装以及自动更新安全证书。如果目前不支持你的服务器自动配置,你同样可以选择手动配置服务器软件来获得安全证书,如果是这样的话,它也无法自动更新。总之,Certbot 提供了自动配置,如果你喜欢手动配置也可以选择不用这个功能。

——Certbot 需要 root 或者 administrator 权限吗?

答:需不需要 root 权限取决于你怎么使用 Certbot。如果你正在使用一个没有 root 权限的虚拟主机(非独立服务器或VPS),首先你要确保的是你需要有方法安装安全证书,如果还不行的话,你需要跟你的虚拟主机提供商提出支持 Let’s Encrypt(很多人已经这么做了),如果可以而你只是在担心一些安全问题的话,那就好办了,请继续往下看。

webroot 和 manual 插件可以在不需要 root 权限的情况下运行,但是你需要确保 Certbot 运行的目录是可写的,比如 /etc/letsencrypt/、/var/log/letsencrypt/ 和 /var/lib/letsencrypt/ ; 或者用 –config-dir、 –logs-dir 和  –work-dir 参数指定 Certbot 的运行目录。而 standalone 则需要 root 权限来绑定 80 或者 443 端口,在 Linux 系统上你可以把  CAP_NET_BIND_SERVICE 权限授予相关用户。

Certbot 的 Apache 和 Nginx 插件需要 root 权限来建立临时文件夹,并且要修改一些 webserver 配置以让其完美运行。

——Certbot 可以使用我已有的私钥或者 CSR (Certificate Signing Request)证书吗?

答:是的,你可以用已有的私钥来获得你的安全证书(当然,你的私钥需要是合法的尺寸和类型),只要你愿意,你也可以使用已有的 CSR。

——我的网页服务器监听的端口不是 80,可以部署证书吗?

答:可以,你可以使用 TLS-SNI-01,不过目前这个方法只支持 Apache web server,如果你用的是 webroot 模式,那么你你的网页服务器必须监听在 80 端口。

 

呜呼,安得 SSL 安全证书千万张,大庇天下网站安全俱欢颜!希望互联网早日进入 https 普及化。

 

3 thoughts on “HPPTS 背景知识简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程

    1. Thanks Sarah. It’s certainly a commitment to take care of a yard and gacrsne….espedially in this heat. We’ll make sure to check in with your blog. It’s a lot of fun to document everything this way so good luck as you get your blog off the ground.

发表回复