轻松上Https | 为你的网站免费配置Let's Encrypt证书

写在前边


为什么要部署 Https

说到底,就是 https 更安全。甚至为了安全,一个专业可靠的网站, https 是必须的。如今,没有部署 Https 的网站,无论是 Chrome 还是 Firefox,都会将其标记为醒目的不安全网站。Https 的网站,还能够防止 DNS 被劫持,注入广告。所以,为什么不呢?

什么是 Let's Encrypt

Let's Encrypt是一个免费,自动化和开放的证书颁发机构(CA),为公众的利益而运行。它是由Internet Security Research Group(ISRG)提供的服务。

其为用户提供所需的数字证书,以便以最友好的方式免费为网站启用 HTTPS(SSL / TLS)。我们这样做是因为我们想要创建一个更安全,更尊重隐私的 Web。

Let's Encrypt背后的关键原则是:

  • 免费:拥有域名的任何人都可以使用Let's Encrypt以零成本获得可信证书。

  • 自动:在 Web 服务器上运行的软件可以与Let's Encrypt交互,以便轻松获取证书,安全地配置它以供使用,并自动进行续订。

  • 安全:Let's Encrypt将作为推动 TLS 安全最佳实践的平台,无论是在 CA 方面还是通过帮助网站运营商正确保护其服务器。

  • 透明:所有颁发或撤销的证书将被公开记录,供任何人查阅。

  • 开放:自动发布和续订协议将作为其他人可以采用的开放标准发布。

  • 合作:就像基础互联网协议本身一样,让加密是一项让社区受益的共同努力,超越任何一个组织的控制。

Cerbot 就是Let's Encrypt提供的客户端

安装 Certbot


Certbot 是一个易于使用的自动客户端,可为您的 Web 服务器提取和部署 SSL / TLS 证书。Certbot 由 EFF 和其他人开发,作为Let's Encrypt的客户端,Certbot 还将与支持 ACME 协议的任何其他 CA 一起使用。

虽然有许多其他客户端实施 ACME 协议来获取证书,但 Certbot 是最广泛的客户端,可以自动配置您的 Web 服务器以立即开始通过 HTTPS 提供服务。对于 Apache,它还可以选择性地自动执行安全任务,例如调整密码套件和启用重要的安全功能,例如 HTTP→HTTPS 重定向,OCSP 装订,HSTS 和升级不安全请求。

Certbot 是 EFF 加密整个互联网的更大努力的一部分。网站需要使用 HTTPS 来保护网络。与 HTTPS Everywhere 一起,Certbot 旨在建立一个结构更私密,更安全且受到保护以防止审查的网络。

Cenos 7/RHEL 7 安装

安装

Certbot 打包在 EPEL(企业 Linux 的额外包)中。要使用 Certbot,必须先 启用 EPEL 存储库。在 RHEL 或 Oracle Linux 上,还必须启用可选通道。

rpm 安装EPEL

1
$ sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

yum 安装EPEL

1
$ sudo yum -y install epel-release

直接下载EPELrepo

1
$ sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
注意:

如果您在 EC2 上使用 RHEL,则可以通过运行以下命令启用可选通道:

1
2
$ sudo yum -y install yum-utils
$ sudo yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

安装 Cerbot

您可以通过运行以下命令安装 Certbot:

1
$ sudo yum install certbot

Fedora 26 +安装

安装

Certbot 是为您的操作系统打包的,因此安装它只需运行以下命令:

1
$ sudo dnf install certbot

Ubuntu 安装

安装

在 Ubuntu 系统上,Certbot 团队维护PPA。将它添加到存储库列表后,您需要做的就是获取以下包。

1
2
3
4
5
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot / certbot
$ sudo apt-get update
$ sudo apt-get install certbot

部署证书


安装证书

  1. 通常我们使用webroot插件来进行安装

    要使用“webroot”插件获取证书,该插件可以与任何 Web 服务器软件的 webroot 目录一起使用:

    1
    $ sudo certbot certonly --webroot -w /var/www/abc -d abc.com -d www.abc.com -w /var/www/xyz -d xyz.cn -d m.xyz.cn

    此命令将获得abc.comwww.abc.comxyz.cnm.xyz.cn的单个证书; 它会将文件放在/var/www/abc下面以证明前两个域的控制,并在/var/www/xyz下放置第二对。

    如果需要为多个域名签发证书,可以为 web 服务器配置代理到同一个目录

    Apache 虚拟主机配置添加

    1
    2
    3
    4
    5
    6
    Alias /.well-known/acme-challenge/ "/var/www/html/.well-known/acme-challenge/"
    <Directory "/var/www/html/.well-known/acme-challenge/">
    AllowOverride None
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
    </Directory>

    Nginx 虚拟主机配置添加

    1
    2
    3
    location /.well-known/acme-challenge/ {
    root /var/www/html/;
    }
  2. 如果您想使用Let's Encrypt的新 ACMEv2 服务器中的一个插件来发布通配符证书,您还需要在命令行中包含以下标志:

    1
    --server https://acme-v02.api.letsencrypt.org/directory

    查看完整示范

  3. 查看证书位置

    通常,证书安装在/etc/letsencrypt/live

    如步骤一中的例子,/etc/letsencrypt/live目录结构为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ cd /etc/letsencrypt/live
    $ tree .
    .
    |-- abc.com
    | |-- cert.pem -> ../../archive/abc.com/cert2.pem
    | |-- chain.pem -> ../../archive/abc.com/chain2.pem
    | |-- fullchain.pem -> ../../archive/abc.com/fullchain2.pem
    | |-- privkey.pem -> ../../archive/abc.com/privkey2.pem
    | `-- README
    `-- xyz.cn
    |-- cert.pem -> ../../archive/xyz.cn/cert2.pem
    |-- chain.pem -> ../../archive/xyz.cn/chain2.pem
    |-- fullchain.pem -> ../../archive/xyz.cn/fullchain2.pem
    |-- privkey.pem -> ../../archive/xyz.cn/privkey2.pem
    `-- README

    2 directories, 10 files

    通常只有fullchain.pemprivkey.pem用得上

通配符安装

获取证书

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
$ sudo certbot certonly  -d *.domain.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for yiranzai.top

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.domain.com with the following value:

pZDS3qjcuA-W3begyk3T-s_WW70SmewfblJ5vlfImr0

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

这个时候千万不要敲enter

配置 txt 记录,做 DNS 验证

配置如图

查看效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig  -t txt  _acme-challenge.domain.com @8.8.8.8

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t txt _acme-challenge.domain.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61275
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.domain.com. IN TXT

;; ANSWER SECTION:
_acme-challenge.domain.com. 599 IN TXT "pZDS3qjcuA-W3begyk3T-s_WW70SmewfblJ5vlfImr0"

;; Query time: 246 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Sep 19 11:01:52 DST 2018
;; MSG SIZE rcvd: 113

注意第 15 行的 txt 值,与上面得到的一致。

回到获取命令,敲下enter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...
Resetting dropped connection: acme-v02.api.letsencrypt.org
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/domain.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/domain.com/privkey.pem
Your cert will expire on 2018-12-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. 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

搞定

配置 Nginx

这里看下nginx的配置方法,apache我就不举例说明了

顺便默认把http重定向到https

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
server {
listen 80;
server_name abc.com;

location / {
rewrite ^(.*) https://$host$1 permanent;
}
}
server {
listen 443;
server_name abc.com;
root /var/www/abc;

ssl on;
ssl_certificate /etc/letsencrypt/live/abc.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/abc.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;


location / {
try_files $uri $uri/ /index.html;
}
}

重启服务,大功告成

1
$ sudo systemctl reload nginx.service

自动续订


手动

可以将 Certbot 配置为在证书过期之前自动续订证书。由于Let's Encrypt证书持续 90 天,因此最好利用此功能。您可以通过运行以下命令来测试证书的自动续订:

1
$ sudo certbot renew --dry-run

如果这看起来工作正常,您可以通过添加运行以下命令的cron 作业systemd 计时器 来安排自动续订:

1
$ sudo certbot renew

注意:

如果您正在设置cronsystemd作业,建议每天运行两次(在您的证书到期或续订之前,它将不会执行任何操作,但定期运行它会使您的站点有机会保持在线状态案例 a 由于某种原因,我们发生了加密启动的撤销。请在一小时内随机选择续订任务。

Crontab配置

1
2
$ sudo crontab -e
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

管理证书

如果你是通配符证书,自然不用更新证书的域名。这里自然是为非通配符用户准备的.

重新创建和更新现有的证书

即使您已拥有具有某些相同域名的现有证书,也可以使用certonlyrun子命令请求创建单个新证书。

如果请求证书runcertonly指定已存在的证书名称,Certbot 将更新现有证书。否则,将创建新证书并为其指定指定的名称。

--force-renewal--duplicate--expand选项控制 Certbot 的行为重新创建具有相同名称作为现有证书证书时。如果您未指定请求的行为,Certbot 可能会询问您的意图。

--force-renewal告知 Certbot 请求与现有证书具有相同域的新证书。必须通过明确指定每个域-d。如果成功,此证书将与之前的证书一起保存,并且live将更新符号链接(引用)以指向新证书。这是续订特定个人证书的有效方法。

--duplicate告诉 Certbot 使用与现有证书相同的域创建单独的,不相关的证书。此证书与前一个证书完全分开保存。大多数用户在正常情况下不需要发出此命令。

--expand告知 Certbot 使用包含所有旧域和一个或多个其他新域的新证书更新现有证书。使用该--expand选项,使用该-d选项指定所有现有域和一个或多个新域。

例:

1
certbot --expand -d existing.com,example.com,newdomain.com

如果您愿意,可以单独指定域,如下所示:

1
certbot --expand -d existing.com -d example.com -d newdomain.com

考虑使用--cert-name而不是--expand,因为它可以更好地控制修改哪个证书,并允许您删除域以及添加域。

--allow-subset-of-names如果只能获得某些指定的域授权,则告知 Certbot 继续生成证书。如果证书中指定的某些域不再指向此系统,这可能很有用。

每当您以上述任何方式获得新证书时,新证书与以前获得的任何证书一起存在,无论以前的证书是否已过期。产生对多种速率限制新的证书数目是旨在防止 ACME 协议的滥用,如所描述的 在这里

更改证书的域名

--cert-name通过使用-dor --domains标志指定新域,该标志还可用于修改证书包含的域。如果证书example.com 以前包含example.comwww.example.com,它可被修改以仅包含example.com通过仅指定example.com-d--domains标志。例:

1
certbot certonly --cert-name example.com -d example.com

以上操作删除了www.example.com

可以使用相同的格式来扩展证书包含的域集,或者完全替换该集:

1
certbot certonly --cert-name example.com -d example.com example.org,www.example.org

以上操作删除了www.example.com,添加了www.example.orgexample.org

撤销证书

如果您的帐户密钥已被盗用或者您需要撤销证书,请使用该revoke命令执行此操作。请注意,该revoke命令采用证书路径(以结尾cert.pem),而不是证书名称或域。例:

1
certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem

您还可以使用该reason标志指定撤消证书的原因。原因包括:unspecified这是默认的,以及keycompromiseaffiliationchangedsuperseded,和cessationofoperation

1
certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem --reason keycompromise

此外,如果证书是通过--stagingor --test-cert标志获得的测试证书,则该标志必须传递给 revoke子命令。撤销证书后(或其他证书管理任务),可以使用delete子命令从系统中删除所有证书的相关文件:

1
certbot delete --cert-name example.com
文章不错,你都不请我喝杯茶,就是说你呀!
0%
upyun