如何使用mod_md保护Apache在Ubuntu 20.04 LTS上进行加密
如何在Ubuntu 20.04上使用mod_md Lets Encrypt保护Apache并获得免费的TLS/SSL证书?
如何在Ubuntu 20.04 LTS服务器上使用Lets Encrypt保护Apache 2?
Apache服务器附带一个名为mod_md的模块。
我们可以将其用于通过ACME协议进行证书设置。
本教程说明如何使用mod_md模块安装,设置和配置Apache,以在Ubuntu 20.04 LTS服务器上使用Lets Encrypt免费的TLS/SSL证书来保护流量。
如何使用mod_md保护Apache从而在Ubuntu 20.04上进行加密
Lets Encrypt是遵循ACME协议的CA。
可以使用Lets Encrypt为Apache,Nginx和其他服务器颁发免费的TLS/SSL证书。
在本教程中,您将使用mod_md为Ubuntu 20.4上的Apache 2获取免费的TLS/SSL证书,并将证书设置为也自动更新。
我们的示例设置如下:
- 域名www42.theitroad.local
- HTTPS端口443
- 虚拟域配置文件/etc/apache2/sites-available/www42.theitroad.local.conf
通过遵循如何在Ubuntu 20.04上安装Apache指南来确保已安装Apache。
步骤1安装用于加密的mod_md
首先,使用apt命令应用更新:
sudo apt update sudo apt upgrade
然后,通过执行以下命令来安装mod_md:
sudo apt install libapache2-mod-md
在Ubuntu 20.04 LTS上启用mod_md
打开mod_md,执行:
sudo a2enmod md
输出示例:
Enabling module md. To activate the new configuration, you need to run: systemctl restart apache2
确保也激活了mod_ssl,运行:
sudo a2enmod ssl
输出:
Considering dependency setenvif for ssl: Module setenvif already enabled Considering dependency mime for ssl: Module mime already enabled Considering dependency socache_shmcb for ssl: Enabling module socache_shmcb. Enabling module ssl. See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates. To activate the new configuration, you need to run: systemctl restart apache2
必须借助systemctl命令重新加载或重新启动Apache 2
sudo systemctl reload apache2.service
步骤2设定SSL凭证
确保您的Apache 2工作正常并且侦听端口80。
使用ss命令或netstat命令进行验证:
sudo netstat -tulpn | grep ':80' ## 或者 sudo ss -tulpn | grep ':80'
输出示例:
tcp LISTEN 0 128 *:80 *:* users:(("apache2",pid=2550,fd=4),("apache2",pid=2549,fd=4),("apache2",pid=2548,fd=4))
所有客户端都必须通过端口80连接到服务器。
否则,将无法通过Lets Encrypt证书进行验证。
在桌面上,运行:
curl -I http://www42.theitroad.local
curl命令输出验证我们可以连接到端口TCP端口80:
HTTP/1.1 200 OK Date: Wed, 06 May 2020 19:30:43 GMT Server: Apache/2.4.41 (Ubuntu) Last-Modified: Wed, 06 May 2020 19:15:29 GMT ETag: "15e-5a4ff965902a3" Accept-Ranges: bytes Content-Length: 350 Vary: Accept-Encoding Connection: close Content-Type: text/html
让我们编辑/etc/apache2/sites-available/www42.theitroad.local.conf,执行:
sudo nano /etc/apache2/sites-available/www42.theitroad.local.conf
在文件顶部添加以下三个mod_md指令:
## Secure Apache with mod_md Let's Encrypt directives ## ServerAdmin [email protected] MDCertificateAgreement accepted MDomain www42.theitroad.local MDPrivateKeys RSA 4096
其中:
ServerAdmin webmaster @ theitroad.local
:在Lets Encrypt注册您的域时,mod_md将使用此电子邮件地址。- "已接受MDCertificateAgreement":您必须接受Lets Encrypt设置的服务条款条件。
- MDomain www42.theitroad.local:声明一个域名,该域名应由mod_md进行管理以颁发和更新证书。您可以使用完整的域名,例如www.theitroad.local或theitroad.local或www42.theitroad.local。确保它与ServerName匹配。
- " MDPrivateKeys RSA 4096":设置生成的私钥的类型和大小。
这是我完整的配置文件:
## Apache with mod_md Let's Encrypt ## ## mod_md config for Let's Encrypt ## ServerAdmin [email protected] MDCertificateAgreement accepted MDomain www42.theitroad.local MDPrivateKeys RSA 4096 ## HTTP port 80 config ## <VirtualHost *:80> ServerAdmin [email protected] ServerName www42.theitroad.local DocumentRoot /home/theitroad.local/html DirectoryIndex index.html ErrorLog ${APACHE_LOG_DIR}/www42.theitroad.local-error.log CustomLog ${APACHE_LOG_DIR}/www42.theitroad.local-access.log combined # Redirect all http requests to HTTPS (uncomment the following two lines when HTTPS issued) # RewriteEngine On # RewriteRule ^(.*)$ https://%{HTTP_HOST} [R=301,L] </VirtualHost> ## HTTPS Config ## <VirtualHost *:443> SSLEngine on ServerAdmin [email protected] ServerName www42.theitroad.local DocumentRoot /home/theitroad.local/html DirectoryIndex index.html ErrorLog ${APACHE_LOG_DIR}/www42.theitroad.local-ssl-error.log CustomLog ${APACHE_LOG_DIR}/www42.theitroad.local-ssl-access.log combined # Turn on HTTP/2 Protocols h2 http/1.1 # Set HTTP Strict Transport Security Header always set Strict-Transport-Security "max-age=63072000" </VirtualHost> ## Only enable TLS v1.3 and avoid older protocols ## SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2 SSLHonorCipherOrder off SSLSessionTickets off ## Turn on OCSP Stapling ## SSLUseStapling On SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" ## Permission for our DocumentRoot ## <Directory /home/theitroad.local/html> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
在Ubuntu下打开Apaches mod_rewrite和mod_headers
我们已经在配置中声明了重写规则,因此我们需要mod_rewrite。
因此,执行以下命令:
sudo a2enmod rewrite Enabling module rewrite. To activate the new configuration, you need to run: systemctl restart apache2
也打开mod_headers:
sudo a2enmod headers Enabling module headers. To activate the new configuration, you need to run: systemctl restart apache2
检查配置错误,运行:
sudo apache2ctl configtest Syntax OK
步骤3在Ubuntu上使用UFW防火墙打开HTTPS(TCP端口443)
运行以下ufw命令为所有人打开TCP端口443:
sudo ufw allow 443/tcp comment 'accept secure Apache connections'
验证规则:
sudo ufw status
步骤4使用mod_md获取SSL证书
到目前为止,我们在Ubuntu上为Apache安装了mod_md,打开了所有基本模块,并使用防火墙打开了所需的TCP端口。
现在该重启我们的Apache 2服务器,以使用Lets Encrypt证书颁发机构(CA)获得免费的TLS/SSL证书。
因此,重新启动Apache 2服务器:
sudo systemctl restart apache2.service
Apache 2重新启动后,mod_md将立即与Lets Encrypt联系,并请求您的域的证书。
通常最多需要一分钟。
您可以检查服务器错误日志或Apache的mod_status页面,以查看请求是否成功。
这是您在erro.log文件中看到的内容:
sudo tail -f /var/log/apache2/error.log
也可以使用grep命令:
sudo grep 'The Managed Domain' /var/log/apache2/error.log
输出示例表明LE已向我们颁发了免费的TLS/SSL证书:
[Wed May 06 20:17:38.112849 2020] [md:notice] [pid 21777:tid 139807872861952] AH10059: The Managed Domain www42.theitroad.local has been setup and changes will be activated on next (graceful) server restart.
当然,我们也可以访问服务器状态url。
例如:
http://www42.theitroad.local/server-status http://your-public-ip-here/server-status
点击放大
这是SSL Labs测试的输出:
sudo systemctl reload apache2.service
步骤5测试安全的Apache 2连接
您所要做的就是执行以下命令或使用Web浏览器(例如Firefox/Chrome)以确保获得HTTPS连接:
curl -I https://www42.theitroad.local
实际使用curl命令验证我们的HTTPS连接是否正常工作,并且流量得到安全保护和加密
编辑服务器配置文件,运行:
我的安全Apache服务器,具有在Ubuntu 20.04 LTS上运行并由SSL Labs验证的Lets Encrypt TLS/SSL
步骤6使用mod_md和watchdog_module自动更新SSL证书
mod_md使用mod_watchdog模块,该模块为其他模块提供编程挂钩,以运行任务,例如更定期地更新TLS/SSL证书。
换句话说,自动更新模式要求mod_watchdog在服务器中处于活动状态。
因此,请使用以下命令验证是否已激活mod_watchdog:
sudo apache2ctl -M sudo apache2ctl -M | grep mod_watchdog
加载的模块:
core_module (static) so_module (static) watchdog_module (static) http_module (static) unixd_module (static) access_compat_module (shared) alias_module (shared) auth_basic_module (shared) authn_core_module (shared) .... .. ... ssl_module (shared) status_module (shared)
步骤7监控证书状态
现在,我们使用mod_md设置Apache,并从Lets Encrypt获得免费的TLS/SSL。
现在该监视我们的证书状态了。
有两种方法。
首先打开/server-status URL:
https://www42.theitroad.local/server-status https://your-public-ip-here/server-status
编辑你的服务器配置文件,运行:
sudo nano /etc/apache2/sites-available/www42.theitroad.local.conf
追加以下内容:
<Location "/md-status"> SetHandler md-status </Location>
保存并关闭文件。
重新启动服务器并运行:
sudo systemctl restart apache2.service curl https://www42.theitroad.local/md-status
输出示例:
{ "version": "2.0.10", "managed-domains": [ { "name": "www42.theitroad.local", "domains": [ "www42.theitroad.local", "www43.theitroad.local" ], "contacts": [ "mailto:[email protected]" ], "transitive": 1, "ca": { "proto": "ACME", "url": "https://acme-v02.api.letsencrypt.org/directory", "agreement": "accepted" }, "state": 2, "renew-mode": 1, "renew-window": "33%", "warn-window": "10%", "must-staple": false, "cert": { "valid-from": "Wed, 06 May 2020 19:17:37 GMT", "valid-until": "Tue, 04 Aug 2020 19:17:37 GMT", "serial": "040E339A0A7D2224819A550BBB4596279F67", "sha256-fingerprint": "d78933fa946cb71810111876049defa4feb6820c319c69918ba925b463bbd11c" }, "renew": false } ] }