让我们加密 最近进入公众 beta. 感谢 LetsEncrypt 团队的工作和 Fedora 打包程序,官方的 LetsEncrypt 客户端现在在这两个版本中都可用 Fedora 23 和生皮。 要了解 LetsEncrypt 的工作原理或它是什么,您可以在 Fedora 杂志文章向公众宣布 beta 发射。 在本文中,我们提供了一个基本配置来保护 Apache 具有 LetsEncrypt 证书的基于 HTTPD 的站点。
在 Fedora
官方的letsencrypt客户端可以安装在 Fedora 23 或更高版本使用此命令:
dnf install letsencrypt
在官方客户端中,有三种方法可以证明您的域的所有权。
- 手动验证: 秘诀需要人手摆好。
- 独立验证:LetsEncrypt 客户端侦听端口 80 或 443 并响应服务器本身。
- 网络根验证: 客户端指向 web 根目录(例如 /var/www/html
) 并直接写入文件。
在撰写本文时,全自动配置 Apache 和 nginx 正在进行中。
安装软件包后,您将能够使用 –help 标志查看可用选项列表:
letsencrypt --help all
手动验证
手动验证的开销最大,但允许您在与 Web 服务器不同的系统上运行 LetsEncrypt 客户端。 根据您喜欢的安全模型,您可能会发现这是可取的。
默认使用 ncurses 界面,但也可以使用纯文本。
$ letsencrypt --text --email [email protected] --domains www.example.com,example.com,foo.example.com --agree-tos --renew-by-default --manual certonly
仅当您丢失帐户详细信息时才使用电子邮件地址。 这将允许您验证您的身份以撤销证书并申请新证书。
如果列出了多个域,这些域将作为 SubjectAltNames 包含在单个证书中。
然后,客户端提示将每个域的机密存储在特定位置。 运行以下命令来设置秘密位置。
$ cd /var/www/html $ mkdir -p .well-known/acme-challenge $ echo "somethingrandomgivenbyservergoeshere" > .well-known/acme-challenge/anotherrandomthinghere
一旦您确认已设置密钥,ACME 服务器就会测试该站点的该密钥。 如果秘密匹配,LetsEncrypt 将提供证书。 然后应该将证书移动或符号链接以促进自动更新,到正确的位置。
独立验证
独立验证会自动响应挑战,从而允许一些自动化行为。 这种方法的缺点是必须暂时停止 Web 服务器,以便 LetsEncrypt 可以使用自己的 HTTP 服务器侦听并响应质询。
请求独立配置的 IP 必须与请求的域的 A 记录匹配,因此必须在目标 Web 服务器上运行。
$ letsencrypt --text --renew-by-default --email [email protected] --domains www.example.com,example.com,foo.example.com --agree-tos --standalone --standalone-supported-challenges http-01 certonly
用户不需要交互。 如果系统上尚未使用端口 80 或 443,或者可以容忍短暂的停机时间,这将允许自动化。 为了 example,这可能是自动化管理系统中的初始配置步骤,例如 Ansible 在主 Web 服务器实际启动之前。
获得证书后,必须将服务器配置为以某种方式使用它。
网络根验证
这种验证方法是一个很好的中间立场。 如果现有的 Web 服务器正在运行,LetsEncrypt 可以引用 HTML 文档根,客户端将自动创建对 ACME 质询的响应。 此方法还必须在与域的 A 记录匹配的同一系统上运行。
$ letsencrypt --text --renew-by-default --email [email protected] --domains www.example.com,example.com,foo.example.com --agree-tos --webroot --webroot-path /var/www/html certonly
使用 LetsEncrypt 证书
选择的验证完成后,/etc/letsencrypt 将填充与为域选择的方法相匹配的配置,以及使用的密钥、证书和签名请求。
可以将文件复制到适当的位置以供 Web 服务器使用。 一个更好的想法是符号链接它们,因此在未来,续订会在没有其他配置的情况下获取新文件。
一个 example 对于 mod_ssl 配置如下:
$ ln -s /etc/letsencrypt/live/www.example.com/cert.pem /etc/pki/tls/certs/www.example.com.crt $ ln -s /etc/letsencrypt/live/www.example.com/chain.pem /etc/pki/tls/certs/www.example.com.chain.crt $ ln -s /etc/letsencrypt/live/www.example.com/privkey.pem /etc/pki/tls/private/www.example.com.key $ cp /etc/httpd/conf.d/ssl.conf{,.backup} $ sed -i 's@(SSLCertificateFile) .*@1 /etc/pki/tls/certs/www.example.com.crt@' /etc/httpd/conf.d/ssl.conf $ sed -i 's@(SSLCertificateKeyFile) .*@1 /etc/pki/tls/private/www.example.com.key@' /etc/httpd/conf.d/ssl.conf $ sed -i 's@#(SSLCertificateChainFile) .*@1 /etc/pki/tls/certs/www.example.com.chain.crt@' /etc/httpd/conf.d/ssl.conf
重新启动 Web 服务器后,它应该使用新证书。
默认位置的证书将获得 etc_t 类型的 selinux 上下文。 这可以被 httpd 和 nginx 读取,所以他们可以从这个配置开始。 然而,直到基本 selinux 政策 包括 Let’s Encrypt 证书,明智的做法是手动标记它们以防止被利用。
$ semanage fcontext -a -t cert_t '/etc/letsencrypt/(archive|live)(/.*)?' $ restorecon -Rv /etc/letsencrypt
更新证书
这些证书的生命周期仅为 90 天,以减轻可能最终存在的任何流氓证书的影响。 甚至有讨论在未来降低这一点。 用户的期望是创建一个每 30 到 60 天运行一次的自动化作业,以获取有效期为 90 天的新证书。
请求新证书所需要做的就是再次运行letsencrypt 命令,并进行某种性质的新验证,然后将生成新的密钥和证书。
live 目录中的文件实际上是指向 /etc/letsencrypt/archive 中当前版本的符号链接。 这使您可以检查更改历史记录并在需要时回滚。
$ ls -1 /etc/letsencrypt/archive/www.example.com cert1.pem cert2.pem chain1.pem chain2.pem fullchain1.pem fullchain2.pem privkey1.pem privkey2.pem
$ ls -lGg /etc/letsencrypt/live/www.example.com lrwxrwxrwx. 1 41 Dec 2 23:19 cert.pem -> ../../archive/www.example.com/cert2.pem lrwxrwxrwx. 1 42 Dec 2 23:19 chain.pem -> ../../archive/www.example.com/chain2.pem lrwxrwxrwx. 1 46 Dec 2 23:19 fullchain.pem -> ../../archive/www.example.com/fullchain2.pem lrwxrwxrwx. 1 44 Dec 2 23:19 privkey.pem -> ../../archive/www.example.com/privkey2.pem
要使用新文件,只需重新加载 Web 服务器。 如果您使用不需要交互的方法,例如 webroot,则可以通过 cron 或 systemd 计时器轻松实现自动化。
一个 example 有一个计时器将是:
# cd /etc/systemd/system # cat > www-example-com-renewal.service <<EOF [Unit] Description=Automatically renew the www.example.com certificate [Service] Type=oneshot ExecStart=/usr/bin/letsencrypt -d www.example.com --renew-by-default -m [email protected] --agree-tos -t --webroot -w /var/www/html certonly ExecStart=/usr/sbin/systemctl reload httpd EOF # cat > www-example-com-renewal.timer <<EOF [Unit] Description=Trigger an automatic renewal every month [Timer] OnCalendar=monthly Persistent=true [Install] WantedBy=multi-user.target EOF systemctl daemon-reload
吊销证书
有时事情会出错,并且会泄露私钥。 如果发生这种情况,重要的是吊销证书,这样任何人都无法冒充 Web 服务器。 请注意,证书在续订期间不会被吊销,以便重新启动服务或分发文件。
要撤消,请使用具有撤消选项的相同客户端:
$ letsencrypt revoke --cert-path /etc/letsencrypt/archive/www.example.com/cert1.pem
如果执行撤销时出错,则会显示。 否则,就是这样!