用Certbot获取免费的SSL证书

在以前的文章中我分别介绍过如何用TraefikZeroSSL如何获取免费的SSL证书。对于不使用Traefik的朋友来说,手动申请和更换证书稍显麻烦。那么有没有办法可以让普通的服务器上的SSL证书的申请和续期变成一个自动的流程呢?答案是有的,而且从一开始就有……

从我知道有Letencrypt这个东西以来我就知道有个配套工具叫CertBot。由于当时我还没有兴趣搭自己的blog,所以也没有深入了解。这次重新整理Apache相关资料的时候研究了一下才发现自己错过了什么。由于这个工具实在太好用了,忍不住不介绍,下面请允许我讲解一下如何在Apache服务器上使用certbot来自动获取安装SSL证书。

安装certbot

选择对应的服务器类型

Certbot的网站选择你的服务器操作系统和服务器类型。本文以Debian 9 Stretch上运行Apache为例。选择好了之后就会出现对应的安装命令。

certbotinstall

运行命令安装
1
$ sudo apt-get install certbot python-certbot-apache -t stretch-backports
安装DNS插件(optional)

Letsencrypt一般都是用http-01的方式来做域名验证。如果想要用DNS-01做验证,或者说如果想要获取ACMEv2支持的wildcard证书,那么就必须安装DNS插件。可惜的是并不是所有的DNS服务商都有插件存在。可以到一下网站查询最新的列表,假设我们今天的DNS服务商是cloudflare,我们就可以使用下面这个命令来安装cloudflare的DNS插件。

1
sudo apt-get install certbot python3-certbot-dns-cloudflare -t stretch-backports

使用certbot

All In One(获取,安装证书)

这里我假设你已经写好了简单的80端口的virtual host文件,我这里简单写一个config文件。如果需要知道Apache2的virtualhost文件的配置,可以参考小弟之前的文章

1
2
3
4
<VirtualHost *:80>
ServerName sslfor.fun
DocumentRoot "/var/www/html/"
</VirtualHost>

然后我们就可以运行certbot来获取证书了。需要注意的是获取证书的方法很多,我们从最简单的开始说。

使用Apache插件 (http-01)
1
sudo certbot --apache

这个插件会自动查询在服务器上的virtual host文件,然后就可以根据自己需求来获取证书了。下面是范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 运行命令
fomm@certbot-testing:~$ sudo certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache

# certbot自动查询服务器上的virtual host,用户可以选择根据一个或者多个virtual host文件来生成证书
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: sslfor.fun
2: www.sslfor.fun
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# 这里我选择了第一个选项
Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
# 可以看到默认的的情况下certbot使用的是http-1的验证方式,说白了就是自动生成一个用来验证的文件供ACME服务器查验
http-01 challenge for sslfor.fun
Waiting for verification...
# 验证成功之后这个文件就被删除了
Cleaning up challenges
# certbot这个时候就会自动生成一个virtual host文件来handle https的request
Created an SSL vhost at /etc/apache2/sites-available/sslforfun-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/sslforfun-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/sslforfun-le-ssl.conf

# 安装完成之后certbot还会问你需不需要把所有的http流量转到https,我这里选了no,因为我希望自己配置。不过我建议各位最好是把所有的流量都转到https
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):1
Your existing certificate has been successfully installed.

The new certificate covers the following domains: https://sslfor.fun

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=sslfor.fun
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/sslfor.fun-0001/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/sslfor.fun-0001/privkey.pem
Your cert will expire on 2019-08-30. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
使用webroot插件(http-01)

Webroot插件的使用也很简单,只需要告诉certbot你想要获取证书的域名以及这个域名的根目录就可以获取证书。如果你已经有了http的virtual host文件,webroot插件在成功获取证书之后也会自动安装证书并询问用户是否需要redirect,用webroot插件也是只需要一行代码既可。

1
2
3
4
5
# -w 后面是申请域名的根目录,-d 后面是要包含在证书里面的域名
sudo certbot -w /var/www/html/test -d test.sslfor.fun

# 如果需要同一个证书包含多个域名可以输入多组-w和-d
sudo certbot -w /var/www/html/test -d test.sslfor.fun -w /var/www/html/ -d sslfor.fun
获取证书不安装
HTTP-01的方式

上述的两个插件都可以用来只获取证书但是不自动安装,只需要加入 certonly这个attribute就可以。

1
2
sudo certbot certonly --apache
sudo certbot certonly -w /var/www/html/test -d test.sslfor.fun
DNS-01的方式

这里我们已经安装好了cloudflare的插件,下面就可以用DNS-01的方式来获取证书了

1
2
3
4
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/cloudflare.ini \
-d sslfor.fun \

这里cloudflare.ini记录的是你的Cloudflare API key和email,格式如下

1
2
3
# Cloudflare API credentials used by Certbot
dns_cloudflare_email = [email protected]
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567
续约证书

续约直接用下面的命令即可,certbot会自动检查有没有证书在30天内过期,如果有的话就自动续约。

1
sudo certbot renew

更多功能

更换ACME服务器

有些公司也有自己的服务器,如果知道其URL可以通过--server更换certbot获取证书的服务器。这里我用Buypass的ACME服务器作为演示,更多信息请参考官方文档可以参考

注册账户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo certbot register -m '[email protected]' --agree-tos --server 'https://api.buypass.com/acme/directory'
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: No

IMPORTANT NOTES:
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
http-01的方式获取证书

用法跟上文一样,只需要添加--server 'https://api.buypass.com/acme/directory'就可以了。

1
2
sudo certbot --apache --server 'https://api.buypass.com/acme/directory'
sudo certbot -w /var/www/html/test -d test.sslfor.fun --server 'https://api.buypass.com/acme/directory'
获取wildcard证书

如果希望使用通配符证书,就必须使用DNS插件才行。同时需要注意的是目前只有ACMEv2服务器支持通配符证书,因此我们需要加上--server 'https://acme-v02.api.letsencrypt.org/directory'

1
2
3
4
5
6
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/cloudflare.ini \
--server 'https://acme-v02.api.letsencrypt.org/directory' \
-d *.sslfor.fun \
-d sslfor.fun

后记

本文从应用的角度很简单的说了一下certbot的使用方法,可以看到有了这个工具之后,搭配cron就可以形成一个自动续约的方法,基本上就可以规避掉证书过期忘记续约的风险了。当然方便的代价就是在功能上的一些缺失,比如说ECC的证书,LetsEncrypt已经支持ECC但是目前certbot还不支持ECC的证书的获取,希望后续的版本可以支持。

对于自己建站又不想为了https头疼的朋友,千万要试试certbot带来的便利。