前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在 Freebsd 12.0 上通过 Let'S Encrypt 来安全保护 Apache

如何在 Freebsd 12.0 上通过 Let'S Encrypt 来安全保护 Apache

作者头像
雪梦科技
发布2020-05-11 17:28:50
1.1K0
发布2020-05-11 17:28:50
举报
文章被收录于专栏:ITCoderITCoderITCoder

简介

Let’s Encrypt 是一个证书认证机构(CA)。他们提供了一种简单的方式,方便用户获取和安装免费的 TLS/SSL 证书,以便在网络服务器中启动 HTTPS 加密。通过一个软件客户端 Certbot,我们可以很方便的获取和安装免费的 TLS/SSL 证书。

在这边教程中,你将会在一个安装了 Apache 网络服务器的 FreeBSD 12.0 服务器上,通过 Certbot(来自 Let’s Encrypt)来设置一个 TLS/SSL 证书。此外,你还将通过一个 Cron 任务,自动更新该证书。

前提

开始之前,你需要做以下准备:

  1. 一个 FreeBSD 12.0 服务器。参考《How To Get Started with FreeBSD》进行设置。
  2. 参考《FAMP stack tutorial》安装 Apache 服务器。
  3. 启动防火墙,并参考《tutorial》进行配置。
  4. 两个 DNS A 记录指向你的服务器公网地址。我们的步骤将会使用 your-domain 和 www.your-domain 作为域名。这两个域名都需要设置合法的 DNS 记录。你可以参考《DigitalOcean DNS 设置指南》,在 DigitalOcean 平台上添加 DNS 记录。DNS A 记录是必须的,因为 Let’s Encrypt 通过它来验证你拥有这个域名。例如:你需要为域名 your-domain 获取证书,这个域名就必须指向你的服务器,以便完成验证。

一旦这些前提条件都满足了,你可以开始安装 Certbot。这个工具将会允许你来安装 Let’s Encrypt 证书。

步骤 1 - 安装 Certbot 工具

一个 Let’s Encrypt 证书,可以确保用户的浏览器验证,网站服务器是否由一个可信赖的证书机构保护的。通过 HTTPS 加密,所有和 web 服务器的交互都能够得到保护。

在这一步,你将会为你的网站服务器安装 Certbot 工具,并且请求 Let’s Encrypt 服务器为你的域名签发合法证书和秘钥。

运行以下命令来安装 Certbot 和它的 Apache HTTP 插件:

sudo pkg install -y py36-certbot py36-certbot-apache

现在你已经安装好相关软件,你可以接下来在网站服务器中启用 TLS 连接。

步骤 2 - 在 Apache HTTP 服务器中启用 SSL/TLS 连接

默认情况下,Apache HTTP 通常在 80 端口提供 HTTP 服务。这个 80 端口是在主要配置文件httpd.conf中通过Listen 80来配置的。为了允许 HTTPS 连接,你需要将默认端口修改成443。想要添加443 端口,并建立 SSL/TLS 连接,你需要先在 Apache HTTP 服务器中启用mod_ssl模块。

通过grep工具配合-n选项使用,你可以在httpd.conf配置文件中找到这个模块,并且定位到模块具体所在行数。通过运行以下命令,你可以找到mod_ssl.so

grep -n 'mod_ssl.so' /usr/local/etc/apache24/httpd.conf

在输出结果中,你将会看到模块所在行数:

148 #LoadModule ssl_module libexec/apache24/mod_ssl.so

通过移除行首的井号#,来启动这个模块。

使用前面的行数,来打开文件:

sudo vi +148 /usr/local/etc/apache24/httpd.conf

这将会直接打开配置文件,跳到正确的行数,进入编辑状态。

通过按x按键来编辑这一行:

#LoadModule session_dbd_module libexec/apache24/mod_session_dbd.so
#LoadModule slotmem_shm_module libexec/apache24/mod_slotmem_shm.so
#LoadModule slotmem_plain_module libexec/apache24/mod_slotmem_plain.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
#LoadModule dialup_module libexec/apache24/mod_dialup.so
#LoadModule http2_module libexec/apache24/mod_http2.so
#LoadModule proxy_http2_module libexec/apache24/mod_proxy_http2.so

一旦你移除了井号#,输入:wq 然后按 ENTER 回车键,保存并关闭文件。

你已经在 Apache HTTP 服务器中启用了 SSL/TLS 。下一步,你将会在 Apache HTTP 中配置虚拟主机。

步骤 3 - 启用并配置虚拟主机

通过配置虚拟主机,你可以在 Apache HTTP 服务器中部署很多独立的网站。通过在配置文件中相关的虚拟主机配置下,添加指定规则,可以启用 Let’s Encrypt 证书。

首先,你需要在 Apache HTTP 服务器中启用虚拟主机。运行以下命令,定位相关指令:

grep -n 'vhosts' /usr/local/etc/apache24/httpd.conf

你将会在输出结果中看到行号:

508 #Include etc/apache24/extra/httpd-vhosts.conf

现在你可以使用以下命令来编辑文件,并移除这一行行首的井号#:

sudo vi +508 /usr/local/etc/apache24/httpd.conf

像之前一样,按x删除行首的井号#,像下面一样:

...

# User home directories

#Include etc/apache24/extra/httpd-userdir.conf

# Real-time info on requests and configuration

#Include etc/apache24/extra/httpd-info.conf

# Virtual hosts

Include etc/apache24/extra/httpd-vhosts.conf

# Local access to the Apache HTTP Server Manual

#Include etc/apache24/extra/httpd-manual.conf

# Distributed authoring and versioning (WebDAV)

#Include etc/apache24/extra/httpd-dav.conf
...

然后输入 :wq 并且按 ENTER 回车键来保存并关闭文件。

现在,你已经在 Apache HTTP 服务器中启用了虚拟主机。你可以修改默认的虚拟主机配置,使用你自己的域名来替换示例中的域名。

现在你可以在httpd-vhosts.conf配置文件中,添加一个虚拟主机。你将编辑该配置文件,并移除两个已经存在的虚拟主机。

sudo vi +23 /usr/local/etc/apache24/extra/httpd-vhosts.conf

在打开文件,并移除两个现有的虚拟主机配置块以后,添加以下指定配置:

<VirtualHost \*:80>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>

在这个代码块中,按照以下提示进行配置:

  1. ServerAdmin: 网站管理员的 Email 地址
  2. DocumentRoot: 网站根目录
  3. ServerName: 网站域名
  4. ServerAlias: 类似 ServerName,在网站域名前面添加www
  5. ErrorLog: 错误日志路径。所有错误信息将会写入这个错误日志文件
  6. CustomLog: 类似 ErrorLog,但是这个文件用来收集所有访问日志

最后,你需要创建网站根目录。这个路径和你在httpd-vhosts.conf配置文件中声明的DocumentRoot路径一致。

sudo mkdir /usr/local/www/apache24/data/your_domain.com

现在改变文件夹的权限,以便 Apache http 进程能够正常读取:

sudo chown -R www:www /usr/local/www/apache24/data/your_domain.com

现在你已经通过chown命令配合-R选项,递归改变了文件夹的归属。用户和组都被设置成了 www。

现在你已经在 Apache HTTP 服务器中启用了虚拟主机。你还将启用 rewrite 模块。

步骤 4 - 启用 Rewrite 模块

在 Apache HTTP 服务器中启用 rewrite 模块是很有必要的。该模块主要用于改变 URL 地址,例如 将 HTTP 转向 HTTPS。

通过下面的命令找到 rewrite 模块:

grep -n 'rewrite' /usr/local/etc/apache24/httpd.conf

你将会看到下面的结果:

180 #LoadModule rewrite_module libexec/apache24/mod_rewrite.so

通过移除这一行行首的井号# 来启用这个模块。

sudo vi +180 /usr/local/etc/apache24/httpd.conf

编辑文件,按x删除行首的井号#:

#LoadModule actions_module libexec/apache24/mod_actions.so
#LoadModule speling_module libexec/apache24/mod_speling.so
#LoadModule userdir_module libexec/apache24/mod_userdir.so
LoadModule alias_module libexec/apache24/mod_alias.so
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule php7_module libexec/apache24/libphp7.so

# Third party modules

IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]\_\*.conf

<IfModule unixd_module>

保存并退出了文件。

现在,你已经完成了 Apache 中必要的配置。

步骤 5 — 获取 Let’s Encrypt 证书

通过各种插件,Certbot 提供了很多方式来获取 SSL 证书。apache 插件将会重新配置 Apache HTTP 服务器。 通过以下 certbot 命令,来进行交互操作,安装和获取一个单域名的证书。

sudo certbot --apache -d your-domain -d www.your-domain

如果你需要给多域名或者子域名安装合法证书,你可以通过额外的命令参数来传递域名,每个新域名或者子域名前面添加“-d”。 参数列表中的第一个域名将会作为基础域名,传递给 Let’s Encrypt 创建证书。基于这个原因,请将基础域名放在第一个,其他的域名放在后面。

如果这是你第一次在这台服务器上运行 certbot,这个客户端将会让你输入一个 email 地址,并且同意 Let’s Encrypt 的服务协议。做完这些,certbot 将会和 Let’s Encrypt 服务器通讯,然后验证你是否拥有这个待申请证书的域名。

如果验证成功,Certbot 将会问你喜欢怎么配置 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): 2

你将可以选择是否允许同时支持 HTTP 和 HTTPS 访问,或者将所有网络请求强制转向 HTTPS。为了更安全,我们强烈建议你选择第二个选项:如果没有任何不加密连接需求,所有请求强制转向 HTTPS。输入你的选项,并按回车。

这将会更新配置文件,并且使用新设置,重新加载 Apache HTTP 服务器,certbot 将会发送消息,提示部署完成,同时给出证书存储路径。

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at:
  /usr/local/etc/letsencrypt/live/example.com/fullchain.pem
  Your key file has been saved at:
  /usr/local/etc/letsencrypt/live/example.com/privkey.pem
  Your cert will expire on yyyy-mm-dd. 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"
- Your account credentials have been saved in your Certbot
  configuration directory at /usr/local/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.
- 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

你的证书现在已经下载,安装,并且配置好。 在浏览器中改用https://重新加载你的网站,你会发现浏览器上的安全标志。 它通常是一个绿色锁的标志,代表你的网站已经得到安全加密。如果你使用 SSL Labs Server 测试,测试将会通过。

Certbot 已经在配置文件中做了一些重要改变。当它在你的网站服务器上安装时,它会将证书路径记录在指定位置。如果读取httpd-vhosts.conf文件内容,你会看到 Certbot 在配置文件中的修改内容。

例如,在<VirtualHost *:80>段,转向规则写在最后面。

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.your_domain.com [OR]
RewriteCond %{SERVER_NAME} =your_domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Certbot 还创建了一个文件,名称为httpd-vhosts-le-ssl.conf。该文件和 Apache 的证书放在一起。

<IfModule mod_ssl.c>
<VirtualHost \*:443>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common

Include /usr/local/etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem
SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem
</VirtualHost>
</IfModule>

获取 Let’s Encrypt 证书后,你可以开始了解怎么自动刷新证书了。

步骤 6 — 配置证书自动刷新

Let’s Encrypt 证书通常有 90 天的有效期,但是推荐一般 60 天左右刷新一次证书。因为这个原因,最佳实践是每隔一段时间,就自动刷新证书一次。

首先,让我们检查一下用来刷新证书的命令是否能够正常运行。 Let’s Encrypt 客户端 certbot 提供了一个renew命令,会自动检测当前安装证书。当证书有效期小于 30 天时,自动刷新证书。通过使用--dry-run选项,你可以模拟测试一下renew是怎么运行的:

sudo certbot renew --dry-run

确保证书不会过期的一个可操作方式是创建一个 cron 定时任务。这个任务可以每隔一段时间自动执行刷新证书命令。 因为刷新指定第一次检测过期日期,并且之后仅仅在过期日期不足 30 天才会去刷新证书。因此,最安全的方式就是通过创建一个 cron 任务,并且每周或者每天都启动这个任务运行一遍。

Certbot 官方文档推荐每天执行两次刷新任务,

编辑 crontab,创建一个 cron 任务,每天运行两次刷新操作。为了编辑 crontab,请使用 root 用户运行:

sudo crontab -e

输入以下配置,以便希望会在需要的时候,运行任务,刷新证书:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

# Order of crontab fields

# minute hour mday month wday command

# please remove \ from \*

0 0,12 \* \* \* /usr/local/bin/certbot renew

在前两行,声明了环境变量,所使用的 Shell。后面标明了运行的命令和运行的时间周期。

通过这些短短的指令,你已经配置好自动刷新证书的任务。

结论

在这篇教程中,你已经安装了 Let’s Encrypt 客户端 certbot,下载了 SSL 证书,配置 Apache 去使用这些证书,并且设置了自动刷新证书的任务。想要了解更多,请阅读:Certbot 文档

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年11月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 前提
  • 步骤 1 - 安装 Certbot 工具
  • 步骤 2 - 在 Apache HTTP 服务器中启用 SSL/TLS 连接
  • 步骤 3 - 启用并配置虚拟主机
  • 步骤 4 - 启用 Rewrite 模块
  • 步骤 5 — 获取 Let’s Encrypt 证书
  • 步骤 6 — 配置证书自动刷新
  • 结论
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档