介绍
Let's Encrypt是一个新的证书颁发机构(CA),它提供了一种简单的方法来获取和安装免费的TLS / SSL证书,从而在Web服务器上启用加密的HTTPS。 它通过提供一个软件客户端,简化了过程letsencrypt
,试图的所需的步骤大部分(如果不是全部)自动化。 目前,由于Let's Encrypt仍处于开放测试阶段,因此获取和安装证书的整个过程仅在Apache Web服务器上完全自动化。 但是,Let's Encrypt可以用于轻松获取免费的SSL证书,可以手动安装,无论您选择哪种Web服务器软件。
在本教程中,我们将向您展示如何使用Let's Encrypt获取免费的SSL证书,并在CentOS 7上使用HAProxy。我们还将向您展示如何自动更新您的SSL证书。
先决条件
在学习本教程之前,您需要了解一些内容。
你应该有谁拥有非root用户的CentOS 7服务器sudo
权限。 你可以学习如何通过以下第1步-3在我们建立这样一个用户帐户初始服务器设置为CentOS 7教程 。
您必须拥有或控制您希望使用证书的注册域名。 如果您还没有注册域名,您可以向其中一个域名注册商(例如Namecheap,GoDaddy等)注册一个域名。
如果你还没有准备好,一定要创建一条A记录指向你自己的域名服务器的公网IP地址。 这是必需的,因为Let's Encrypt验证您拥有它为其颁发证书的域。 例如,如果你想获得一个证书example.com
,该域必须解析到服务器的验证过程工作。 我们的安装程序将使用example.com
和www.example.com
作为域名,所以需要两个DNS记录 。
一旦你拥有所有的先决条件,让我们继续安装Let's Encrypt客户端软件。
第1步 - 安装让我们加密客户端
第一步用咱们加密获得SSL证书是安装letsencrypt
您的服务器上的软件。 目前,安装Let's Encrypt的最好方法是简单地从官方的GitHub仓库克隆它。 在将来,它很可能通过一个包管理器。
安装Git和Bc
让我们现在安装Git,所以我们可以克隆Let's Encrypt仓库。
安装git
和bc
使用yum包:
sudo yum install git bc
随着git
和bc
安装,我们可以很容易地下载letsencrypt
通过克隆从GitHub存储库。
克隆让我们加密
现在,我们可以克隆在咱们的加密存储库中/opt
使用此命令:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
您现在应该具备的副本letsencrypt
在资源库中/opt/letsencrypt
目录。
第2步 - 获得证书
Let's Encrypt提供了通过各种插件获取SSL证书的各种方法。 不同的是Apache的插件,它是覆盖在不同的教程 ,大多数的插件只会帮助你得到,你必须手动配置你的Web服务器使用证书。 仅获取证书而不安装证书的插件称为“验证器”,因为它们用于验证服务器是否应颁发证书。
我们会告诉你如何使用独立插件来获取SSL证书。
验证端口80是否打开
独立插件提供了一种非常简单的方式来获取SSL证书。 它通过临时运行一个小型Web服务器,端口80
,您的服务器,到了咱们加密CA可以颁发证书之前连接并验证服务器的身份上。 因此,此方法要求端口80
是在不使用。 也就是说,一定要停止正常的网络服务器,如果它使用端口80
(即http
),尝试使用此插件之前。
例如,如果您使用HAProxy,可以通过运行以下命令停止它:
sudo systemctl stop haproxy
如果你不知道,如果端口80
正在使用中,您可以运行此命令:
netstat -na | grep ':80.*LISTEN'
如果运行此命令时没有输出,则可以使用独立插件。
运行让我们加密
用咱们加密之前,更改为letsencrypt
目录:
cd /opt/letsencrypt
现在通过运行以下命令使用独立插件:
./letsencrypt-auto certonly --standalone
注意:咱们的加密软件需要超级用户权限,所以你会被要求,如果你还没有使用输入密码sudo
最近。
之后letsencrypt
初始化,系统将提示您一些信息。 这个确切的提示可能会有所不同,取决于你以前使用Let's Encrypt,但是我们会第一次介绍你。
在提示时,输入将用于通知和丢失的密钥恢复的电子邮件地址:
那么你必须同意让我们加密订阅协议。 选择同意:
然后输入您的域名。 请注意,如果你想有一个单一的证书与多个域名的工作(如example.com
和www.example.com
),一定要包括所有的人:
如果一切顺利,你应该看到一个类似下面的输出消息:
Output:IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to sammy@digitalocean.com
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
您将要记录证书的路径和到期日期,这在示例输出中突出显示。
注意:如果您的域名是通过像CloudFlare的一个DNS服务路由,则需要暂时禁用它,直到你获得的证书。
证书文件
获得证书后,您将拥有以下PEM编码的文件:
- cert.pem:您的域的证书
- chain.pem:该让我们的加密证书链
- fullchain.pem:
cert.pem
和chain.pem
结合 - privkey.pem:您证书的私钥
重要的是,您知道刚刚创建的证书文件的位置,因此您可以在Web服务器配置中使用它们。 这些文件本身被放置在一个子目录中/etc/letsencrypt/archive
。 然而,让我们加密创建符号链接在最新的证书文件/etc/letsencrypt/live/ your_domain_name
目录。
您可以通过运行此命令(在您的域名中替换)检查文件是否存在:
sudo ls /etc/letsencrypt/live/your_domain_name
输出应该是前面提到的四个证书文件。
组合Fullchain.pem和Privkey.pem
在配置HAProxy的执行SSL终止,所以将加密本身和最终用户之间的流量,你必须结合fullchain.pem
和privkey.pem
到单个文件。
首先,创建其中组合文件将放置,目录/etc/haproxy/certs
:
sudo mkdir -p /etc/haproxy/certs
接下来,创建与此组合的文件cat
命令(以突出显示example.com
与您的域名):
DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'
使用此命令安全访问包含私钥的组合文件:
sudo chmod -R go-rwx /etc/haproxy/certs
现在我们准备好使用HAProxy的SSL证书和私钥。
第3步 - 安装HAProxy
此步骤包括HAProxy的安装。 如果已经安装在您的服务器上,请跳过此步骤。
使用yum安装HAProxy:
sudo yum install haproxy
HAProxy现已安装,但需要配置。
第4步 - 配置HAProxy
本节将介绍如何使用SSL设置配置基本HAProxy。 它还包括如何配置HAProxy以允许我们自动更新我们的加密证书。
打开haproxy.cfg
在文本编辑器:
sudo vi /etc/haproxy/haproxy.cfg
保持此文件打开,我们在接下来的几个部分中编辑它。
全球科
该行添加到全球部分配置生成的临时DHE键的最大尺寸:
tune.ssl.default-dh-param 2048
前端部分
现在,我们已经准备好来定义我们frontend
部分。
注意:默认HAProxy的配置包括前端和后端的几个。 随意删除他们,因为我们不会使用它们。
我们要添加的第一件事是前端来处理传入的HTTP连接,并将它们发送到默认后端(我们将在后面定义)。 在文件的结尾,让我们添加一个名为WWW-HTTP前端。 务必更换haproxy_public_IP
与HAProxy的服务器的公网IP地址:
frontend www-http
bind haproxy_www_public_IP:80
reqadd X-Forwarded-Proto:\ http
default_backend www-backend
接下来,我们将添加一个前端来处理传入的HTTPS连接。 在文件的结尾,添加一个名为WWW-HTTPS前端。 务必更换haproxy_www_public_IP
与HAProxy的服务器的公网IP。 此外,您将需要更换example.com
与您的域名(应该对应于前面创建的证书文件):
frontend www-https
bind haproxy_www_public_IP:443 ssl crt /etc/haproxy/certs/example.com.pem
reqadd X-Forwarded-Proto:\ https
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
default_backend www-backend
这前端使用一个ACL( letsencrypt-acl
)送咱们加密验证请求( /.well-known/acme-challenge
)到letsencrypt-backend
的后端,这将使我们能够续订证书不停止HAProxy的服务。 所有其他请求都将被转发到www-backend
,这是将服务于我们的Web应用程序或网站后端。
后端节
配置完的前端后,添加www-backend
通过添加以下行后端。 一定要与您的Web服务器(调整数各自的私有IP地址来替换高亮的话server
线路,以配合你有多少后端服务器有):
backend www-backend
redirect scheme https if !{ ssl_fc }
server www-1 www_1_private_IP:80 check
server www-2 www_2_private_IP:80 check
这个后端接收将在其进行平衡的任何流量server
的条目,通过HTTP(80端口)。
最后,添加letsencrypt-backend
通过增加这些线路的后端,
backend letsencrypt-backend
server letsencrypt 127.0.0.1:54321
这个后端,只处理了用于证书请求和续订让我们加密ACME的挑战,将流量发送到端口本地主机54321
。 我们将使用此端口而不是80
和443
,当我们再次让我们加密的SSL证书。
现在我们准备开始HAProxy:
sudo systemctl start haproxy
注意:如果您遇到麻烦haproxy.cfg
配置文件,看看这GitHub的要点的一个例子。
Let's Encrypt TLS / SSL证书现已到位,我们已准备好设置自动续订脚本。 此时,您应该通过在网络浏览器中访问您的域来测试TLS / SSL证书的工作原理。
第5步 - 设置自动续订
让我们加密证书有效期为90天,但建议您每60天更新证书以允许有误差。 在撰写本文时,自动更新仍然不能作为客户端本身的功能,但您可以通过再次运行Let's Encrypt客户端手动更新您的证书。
确保您的证书不会过时的一个实用方法是创建一个cron作业,将自动处理您的更新过程。 为了避免我们之前使用的交互式,菜单驱动的过程,当在cron作业中调用Let's Encrypt客户端时,我们将使用不同的参数。
我们将使用先前使用的独立插件,但其配置为使用端口54321
,以便它不与HAProxy的(这在端口监听冲突80
和443
)。 要做到这一点,我们将使用此命令(在您的域名为突出取代example.com
域):
cd /opt/letsencrypt
./letsencrypt-auto certonly --agree-tos --renew-by-default --standalone-supported-challenges http-01 --http-01-port 54321 -d example.com -d www.example.com
一旦成功,你需要创建一个新的组合证书文件(替换example.com
与您的域名):
DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'
然后重新加载HAProxy以开始使用新证书:
sudo service haproxy reload
现在我们知道我们需要更新证书的命令,我们可以使用脚本和cron作业自动化这个过程。
创建一个让我们加密配置文件
在进行下一步之前,让我们通过创建一个让我们加密配置文件简化我们的更新过程/usr/local/etc/le-renew-haproxy.ini
。
sudo cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-haproxy.ini
现在打开文件进行编辑;
sudo nano /usr/local/etc/le-renew-haproxy.ini
其次,取消email
和domains
线,并使用自己的信息进行更新。 该文件(删除注释)应该看起来像这样:
rsa-key-size = 4096
email = you@example.com
domains = example.com, www.example.com
其次,取消了standalone-supported-challenges
行,并取代其价值http-01
。 这告诉Let's Encrypt使用它应该看起来像这样(更改的值突出显示为红色):
standalone-supported-challenges = http-01
现在,我们可以使用Let's Encrypt配置文件来填充空格,而不是在命令中指定域名。 假设您的配置文件是正确的,此命令可用于续订您的证书:
cd /opt/letsencrypt
./letsencrypt-auto certonly --renew-by-default --config /usr/local/etc/le-renew-haproxy.ini --http-01-port 54321
注意:如果您遇到的麻烦le-renew-haproxy.ini
配置文件,看看这GitHub的要点的一个例子。
现在让我们创建一个脚本,我们可以使用它来更新我们的证书。
创建续订脚本
要自动完成更新过程,我们将使用一个shell脚本,该脚本将验证所提供的域的证书过期日期,并在到期时间少于30天时请求续订。 此脚本将安排为每周运行一次。 这样,即使一个cron作业失败,有一个30天的窗口,每周再试一次。
首先,下载脚本并使其可执行。 在下载之前,可以随意查看脚本的内容。
sudo curl -L -o /usr/local/sbin/le-renew-haproxy https://gist.githubusercontent.com/thisismitch/7c91e9b2b63f837a0c4b/raw/700cfe953e5d5e71e528baf20337198195606630/le-renew-haproxy
sudo chmod +x /usr/local/sbin/le-renew-haproxy
该le-renew-haproxy
脚本会作为参数的域名要检查续期的证书。 当尚未需要更新时,它将简单地输出在给定证书过期之前剩余的天数。
注意:如果该脚本将不会运行/usr/local/etc/le-renew-haproxy.ini
文件不存在。 此外,请确保配置文件中指定的第一个域与您最初创建证书时指定的第一个域相同。
如果现在运行脚本,您将可以看到此证书到期的剩余天数:
sudo /usr/local/sbin/le-renew-haproxy
outputChecking expiration date for example.com...
The certificate is up to date, no need for renewal (89 days left).
接下来,我们将编辑crontab以创建一个新作业,将每周运行此命令。 要为root用户编辑crontab,请运行:
sudo crontab -e
将以下内容包含在一行中:
30 2 * * 1 /usr/local/sbin/le-renew-haproxy >> /var/log/le-renewal.log
保存并退出。 这将创建一个新的cron作业将执行le-renew-haproxy
凌晨2:30命令每星期一。 由命令生成的输出将通过管道输送到位于日志文件/var/log/le-renewal.log
。
结论
而已! HAProxy现在使用免费的Let's Encrypt TLS / SSL证书来安全地提供HTTPS流量。