如何使用mod_md保护Apache在Ubuntu 20.04 LTS上进行加密

时间:2020-01-09 10:39:41  来源:igfitidea点击:

如何在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
    }
  ]
}