如何安装Let’s Encrypt SSL证书来保护RHEL/CentOS 7/6上的Apache

延伸上一篇关于SSL/TLS免费证书的Let’s Encrypt教程,本文将演示如何获取并安装由Let’s Encrypt证书颁发机构Apache Web服务器在CentOS/RHEL 7/6和Fedora发行版上发布的免费SSL/TLS证书。

如果您想在Debian和Ubuntu上为Apache安装Let’s Encrypt,请按照以下指南进行:

设置Let’s Encrypt以保护Debian和Ubuntu上的Apache

测试样本环境
Install Lets Encrypt for Apache on CentOS and RHEL

要求

  1. A registered domain name with valid A records to point back to your server public IP Address.
  2. 已安装带有SSL模块和虚拟主机功能的Apache服务器,以防您托管多个域或子域。

步骤1:安装Apache Web服务器

1. 如果尚未安装,可以通过发出以下命令来安装httpd守护程序:

# yum install httpd

2. 为了让Let’s Encrypt软件与Apache一起工作,请确保通过发出以下命令来安装SSL/TLS模块:

# yum -y install mod_ssl

3. 最后,通过以下命令启动Apache服务器:

# systemctl start httpd.service          [On RHEL/CentOS 7]
# service httpd start                    [On RHEL/CentOS 6]

步骤2:安装Let’s Encrypt SSL证书

4. 安装 Let’s Encrypt 客户端的最简单方法是在您的文件系统中克隆 github 存储库。要在系统上安装 git,您必须使用以下命令启用 Epel 存储库。

# yum install epel-release

5. 一旦在您的系统中添加了 Epel 存储库,请继续通过运行以下命令安装 git 客户端:

# yum install git

6. 现在,一旦您安装了处理 Let’s Encrypt 所需的所有依赖项,请转到 /usr/local/ 目录,并使用以下命令从其官方 github 存储库拉取 Let’s Encrypt 客户端:

# cd /usr/local/
# git clone https://github.com/letsencrypt/letsencrypt

第 3 步:为 Apache 获取免费的 Let’s Encrypt SSL 证书

7.CentOS/RHEL 自动化获取 Apache 的免费 Let’s Encrypt 证书,感谢 apache 插件。

运行 Let’s Encrypt 脚本命令以获取 SSL 证书。从 /usr/local/letsencrypt 进入 Let’s Encrypt 安装目录,并通过提供 --apache 选项和每个子域所需证书的 -d 标志来运行 letsencrypt-auto 命令。

# cd /usr/local/letsencrypt
# ./letsencrypt-auto --apache -d your_domain.tld 
Create Lets Encrypt SSL Certificate for Apache

8. 提供 Let’s Encrypt 将用于找回您丢失的密钥或紧急通知的电子邮件地址,然后按 Enter 继续。

Add Email Address for Lets Encrypt

9. 通过按 Enter 键同意许可证条款。

Agree Lets Encrypt License

10.CentOS/RHEL 上,默认情况下,Apache 服务器不像基于 Debian 的发行版那样将启用主机的目录与可用(未激活)主机分开。

此外,默认情况下虚拟主机是禁用的。指定服务器名称的 Apache 语句(ServerName)在 SSL 配置文件中不存在。

要激活此指令,Let’s Encrypt 将提示您选择一个虚拟主机。因为找不到任何可用的虚拟主机,请选择要由 Let’s Encrypt 客户端自动修改的 ssl.conf 文件,然后按 Enter 继续。

Active VirtualHost Directive and Select Mod_SSL

11. 接下来,选择 Easy 方法用于 HTTP 请求,然后按 Enter 继续。

Allow Easy HTTP Requests

12. 最后,如果一切顺利,屏幕上应显示祝贺消息。按 Enter 释放提示符。

Lets Encrypt Enabled on Domain

就是这样!您已成功为您的域颁发了一个 SSL/TLS 证书。现在您可以开始使用 HTTPS 协议浏览您的网站。

第 4 步:在域上测试免费的 Let’s Encrypt 加密

13. 为了测试您的域 SSL/TLS 握手的直接性,请访问下面的链接并在您的域上测试您的证书。

https://www.ssllabs.com/ssltest/analyze.html
Verify Lets Encrypt Certificate on Domain

14. 如果您收到一系列关于您的域在进行的测试中存在漏洞的报告,则需要紧急修复这些安全漏洞。

整体评级为C类会使您的域名非常不安全。要解决这些安全问题,请打开Apache SSL配置文件并进行以下更改:

# vi /etc/httpd/conf.d/ssl.conf

搜索包含SSLProtocol语句的行,并在行尾添加-SSLv3

Fix Apache SSL Configuration

深入文件,搜索并注释包含SSLCipherSuite的行,在该行前面加上#,并在该行下方添加以下内容:

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLOptions +StrictRequire
Configure SSL Configuration

15.完成以上所有更改后,保存并关闭文件,然后重新启动Apache守护进程以应用更改。

# systemctl restart httpd.service          [On RHEL/CentOS 7]
# service httpd restart                    [On RHEL/CentOS 6]

16.现在,通过访问与上述相同的链接再次测试您的域名加密状态。要执行重新测试,请从网站中点击清除缓存链接。

https://www.ssllabs.com/ssltest/analyze.html 
Test Lets Encrypt SSL Certificate on Website

现在您应该会获得A类整体评级,这意味着您的域名非常安全。

步骤4:在Apache上自动更新Let’s Encrypt证书

17.Let’s Encrypt软件的这个测试版本发布的证书有效期为90天。因此,为了更新SSL证书,您必须在到期日期之前再次执行letsencrypt-auto命令,并使用获取初始证书时使用的相同选项和标志。

下面是手动更新证书的示例。

# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --apache --renew-by-default  -d your_domain.tld

18. 要自动化这个过程,请在/usr/local/bin/目录下创建以下由github erikaheidi提供的bash脚本,并包含以下内容。(脚本稍作修改以反映我们的letsencrypt安装目录)。

# vi /usr/local/bin/le-renew-centos

将以下内容添加到le-renew-centos文件中:

!/bin/bash

domain=$1
le_path='/usr/local/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
        certdomain=$1
        config_file="$le_conf/renewal/$certdomain.conf"

        if [ ! -f $config_file ] ; then
                echo "[ERROR] The config file for the certificate $certdomain was not found."
                exit 1;
        fi

        domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
        last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')

        if [ "${last_char}" = "," ]; then
                domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
        fi

        echo $domains;
}

if [ -z "$domain" ] ; then
        echo "[ERROR] you must provide the domain name for the certificate renewal."
        exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"

if [ ! -f $cert_file ]; then
        echo "[ERROR] certificate file not found for domain $domain."
        exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."

if [ "$days_exp" -gt "$exp_limit" ] ; then
        echo "The certificate is up to date, no need for renewal ($days_exp days left)."
        exit 0;
else
        echo "The certificate for $domain is about to expire soon. Starting renewal request..."
        domain_list=$( get_domain_list $domain )
        "$le_path"/letsencrypt-auto certonly --apache --renew-by-default --domains "${domain_list}"
        echo "Restarting Apache..."
        /usr/bin/systemctl restart httpd
        echo "Renewal process finished for domain $domain"
        exit 0;
fi

19. 为脚本授予执行权限,安装bc软件包,并运行脚本以进行测试。将您的域名作为脚本的位置参数。执行以下命令以完成此步骤:

# yum install bc
# chmod +x /usr/local/bin/le-renew-centos
# /usr/local/bin/le-renew-centos your_domain.tld

20. 最后,使用Linux调度,在每两个月添加一个新的cron作业,以确保在到期日期之前更新您的证书。

# crontab -e

将以下行添加到文件底部。

0 1 1 */2 * /usr/local/bin/le-renew-centos your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1

就这样!您的运行在CentOS/RHEL系统上的Apache服务器现在正在使用免费的Let’s Encrypt SSL证书提供SSL内容。

Source:
https://www.tecmint.com/install-lets-encrypt-ssl-certificate-to-secure-apache-on-rhel-centos/