将 SSL 转移到 Ubuntu 16.04 或 CentOS 7

SSL 证书已成为每个网站事实上的一部分。 如果您的站点上还没有 SSL 来加密数据,那么您应该这样做。 现代浏览器不是在受 SSL 保护的网站上显示额外的安全层,而是在网站没有 SSL 时显示警告,本质上要求网站保持其正面形象。

从一台服务器移动到另一台服务器时,您的 SSL 需要做什么才能保持您的安全状态? 我们将介绍转移传统和 Let’s Encrypt SSL 到 Ubuntu 16.04 和 CentOS 7。

注意:本文将讨论 SSL Apache 具体来说,相同的概念适用于任何支持 SSL 加密的服务。

SSL 可以在服务器之间传输吗?

绝对地! SSL 仅包含少量文本文件和一些安全服务配置。 此外,还有一种误解,即证书永久绑定到其 IP 地址或物理服务器,但事实并非如此。 实际上,它们仅与证书中列出的域名相关联,并且非常易于迁移。 从技术上讲,可以在多个服务器或服务上使用 SSL 来保护同一个域名。 我们将利用这个概念来帮助我们移动 SSL。

先决条件

您将需要一份您的 SSL 证书和 SSL 私钥以及任何“链证书”的副本。 通常这些将是两个单独的文件,称为 域名.com.crt 对于证书,和 域名.com.key 对于私钥,以及额外的 签名授权.crt 链证书的文件。 这些文件的另一个流行命名约定是 cert.pem 和 key.pem,但有时它们根本没有文件后缀(.pem 或 .crt)。

你怎么知道从哪里得到这些文件? 我们将首先讨论如何确定这些配置的位置。

第 1 步:收集 SSL 文件

Debian SSL 文件位置

在包括 Ubuntu 在内的 Linux 发行版中,您可以在 Apache 使用:

apache2ctl -S

CentOS SSL 文件位置

对于基于 RHEL 的发行版,包括 CentOS,您可以使用:

httpd -S

这两个命令都将列出正在运行的配置设置,包括所有加载的虚拟主机及其配置文件位置。 我们正在寻找我们要复制的 SSL 的域名,以及 HTTPS 端口 443。在我的 Ubuntu 测试机器上,对于 example,这一行是相关域的输出:

port 443 namevhost domain.com (/etc/apache2/sites-enabled/domain.com.conf:1)

由于我们正在为 domain.com 域复制 SSL,因此我们将检查此配置文件,并查找引用端口 443 的虚拟主机块。

vim /etc/apache2/sites-enabled/domain.com.conf

通过文件搜索,我们发现:

<VirtualHost *:443>
ServerName domain.com
ServerAlias www.domain.com
DocumentRoot /data/www/domain.com
SSLCertificateFile /etc/ssl/domain.com/cert.pem
SSLCertificateKeyFile /etc/ssl/domain.com/privkey.pem
SSLCertificateChainFile /etc/ssl/domain.com/chain.pem
</VirtualHost>

此文本块描述了我们需要带到新服务器的所有三个文件:证书文件(证书.pem), 私钥 (私钥文件) 和中间证书 (链.pem)。

第 2 步:复制 SSL 文件

从我们在上一步中发现的文件路径中,我们知道该站点的所有 SSL 文件都存在于 /etc/ssl/domain.com 目录。 因此,我们可以使用 rsync 工具将整个文件夹复制到新服务器。 假设旧服务器的 IP 为 123.45.67.89,跳转到新服务器,然后运行以下命令。 尾随斜杠 (/) 对于此命令非常重要!

mkdir -p /etc/ssl
rsync -avz [email protected]:/etc/ssl/domain.com /etc/ssl/

此方法保留了这些文件的所有权和权限,因此我们不必在这方面做任何其他事情。 我们的下一部分,第 3 步,分为两个部分。 如果您的新服务器是 Ubuntu 16.04 或 步骤 3B 如果你的新服务器是 CentOS 7。

步骤 3A:设置 Apache 在新服务器上(Ubuntu 16.04)

新服务器上的域需要设置非 SSL 虚拟主机。 如果您还没有这样做,您需要安装并激活 mod_ssl 以允许 Apache 解析目标机器上的 SSL 通信:

apt-get install mod_ssl
a2enmod ssl

如果您收到 mod_ssl 无法安装的消息,则可能是通过不同的软件包安装的。 检查是否是这种情况:

dpkg -S mod_ssl.so

如果这返回一个肯定的结果,您将运行:

a2enmod ssl 完成激活。 启用 mod_ssl 后,重启 Apache:

systemctl restart apache2

最后,有一个配置文件需要更改,它允许服务命名虚拟主机。 SSL 模块的激活让 Apache 监听端口 443,但我们需要能够为每个 IP 托管多个站点。 打开 /etc/apache2/ports.conf 文件:

vim /etc/apache2/ports.conf

确保内容模仿此输出:

<IfModule ssl_module>
NameVirtualHost *:80
Listen 80
NameVirtualHost *:443
Listen 443
</IfModule>

具体来说,我们确保 名称虚拟主机 存在线条。 一旦这是真的,我们可以测试并重新加载配置以使其生效:

apachectl configtest
systemctl reload apache2

注意:即使启用的站点的配置在 /etc/apache2/启用站点/,实际的配置文件应该在 /etc/apache2/sites-available/,以便 apache 控制脚本可以打开和关闭站点。 这 启用站点 文件夹仅包含指向配置的符号链接 网站可用.

接下来,我们必须为网站添加一个配置,以调用我们刚刚复制过来的 SSL 文件。 如果您在新服务器上使用与旧服务器上相同的文档根目录,则可以将原始虚拟主机块复制并粘贴到新的配置文件中 /etc/apache2/sites-available/. 请务必更新引用的 IP 以匹配新服务器。

如果在新机器上运行的模块或执行的其他自定义存在差异,请将目标服务器上现有的非 SSL 虚拟主机块复制到单独的文件中。 另外,根据 /etc/apache2/sites-available/,更新端口号,并为 SSL 文件添加三行。 对于我们的 example,我将旧文件的确切内容复制并粘贴到 /etc/apache2/sites-available/domain.com_ssl.conf.

完成后,我们运行:

a2ensite domain.com_ssl

这会将配置链接到 /etc/apache2/启用站点/ 文件夹。 此站点名称将根据您对配置文件的命名而改变(只需切断 .conf)。 接下来,我们测试这个新配置:

apachectl configtest

如果一切恢复正常,我们可以重新加载 apache2 服务的配置文件:

systemctl reload apache2

步骤 3B:设置 Apache 在新服务器上(CentOS 7)

CentOS 的每个命令行操作都有很大的不同,但大体的流程是一样的,配置文件也会有类似的内容。 首先,确认 Apache 配置为支持 SSL 流量:

yum install mod_ssl

此安装过程应自动设置一个 ssl.conf 为你归档 /etc/httpd/conf.d/ 用于侦听端口 443 并重新启动 Apache,但它可能无法启用命名虚拟主机。 确保将以下行添加到您的 httpd.conf 文件以及如果它不存在。 添加这些行允许您使用虚拟主机块为每个 IP 地址提供多个站点。

<IfModule mod_ssl.c>
NameVirtualHost *:443
</IfModule>

接下来,我们必须为网站添加一个配置,以调用我们刚刚复制过来的 SSL 文件。 如果您在新服务器上使用与旧服务器上相同的文档根目录,请将原始虚拟主机块复制并粘贴到新的配置文件中 /etc/httpd/conf.d/,确保更新 IP 地址以匹配目标服务器上的地址。

如果在新机器上运行的模块或执行的其他自定义存在差异,您可以将目标服务器上现有的非 SSL 虚拟主机块复制到单独的文件中。 此外,在 /etc/httpd/conf.d/,更新端口号,并为 SSL 文件添加三行。

创建后,测试文件的配置语法:

httpd -t输出要么说’语法OK‘ 或者告诉你哪个文件和行有问题。 如果一切正常,您可以重新加载配置 Apache:

systemctl reload httpd

如果我使用怎么办 Let’s Encrypt?

Let’s Encrypt SSL 与任何其他 SSL 一样可转让,但手动创建 SSL 虚拟主机配置文件有时会导致与未来安装的冲突 Let’s Encrypt. 因此,需要遵循特定的程序。

转移 Let’s Encrypt 安装

第一的, Let’s Encrypt 应该安装在新服务器上。 对于 Ubuntu 16.04,看起来像这样:

add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install python-certbot-apache

对于 CentOS 7,请使用以下命令:

yum install epel-release
yum install python-certbot-apache

在任一发行版上安装后,设置一个 cron 以自动更新证书。 您可以通过运行来设置这些

crontab -e 作为根用户。 我的 Ubuntu 机器上的 cron 如下所示:

45 2 * * 6 /usr/bin/certbot renew && systemctl reload apache2

在我的 CentOS 服务器上,它看起来像这样:

45 2 * * 6 /usr/local/letsencrypt/certbot-auto renew && systemctl reload httpd

接下来,我们可以把整个 /etc/letsencrypt 目录,其中包含配置文件。 该目录包含证书和密钥本身。 在新服务器上,我们运行:

rsync -avz 123.45.67.89:/etc/letsencrypt /etc/

现在文件已经到位,我们可以 Let’s Encrypt 重新安装我们同步的所有证书:

/usr/local/letsencrypt/certbot-auto install --apache

运行该命令会显示证书中的编号列表 /etc/letsencrypt 文件夹。 选择您要为其设置配置的站点的编号,它将创建您的配置文件; 完成后,您只需要重新加载 Apache:

systemctl reload apache2 #ubuntu
systemctl reload httpd #centos

第四步:确认操作

现在可以使用本文中详细介绍的 hosts 文件修改来测试新服务器。 这确实是测试迁移目标功能的最佳方式,因为浏览器和服务器都认为这是真实域名上的真实流量。

一旦你设置了你的主机文件并刷新了你的 DNS 缓存,你应该能够使用 https 在浏览器中加载网站,并看到你的网站在目标机器上使用原始证书保护! 不过不用担心; 实时流量仍然使用相同的 SSL 路由到原始服务器,因此您的网站访问者不会注意到您的测试。

在您完成 SSL 安装测试并确认您的网站在新服务器上运行良好后,可以更新已迁移站点的 DNS 以使新服务器生效。

如果您正在使用 Let’s Encrypt,请务必牢记您的证书到期日期。 例如,如果您的证书计划在 7 天后到期,您将希望在传输后立即更新 DNS,以便新服务器可以接管证书续订。 如果你错过了这个窗口并且证书在源服务器上更新,你可以简单地重新运行我们收集的 rsync 命令 /etc/letsencrypt

rsync -avz 123.45.67.89:/etc/letsencrypt /etc/

需要帮助为您的迁移目标订购签名 SSL 或订购新服务器? 与我们的解决方案团队聊天!