简介
本教程将向您展示如何从受信任的商业证书颁发机构(CA)获取并安装 SSL 证书。SSL 证书允许 Web 服务器加密其流量,并提供一种验证服务器身份的机制。使用 SSL 的网站通过 https://
协议访问。
在2010年代中期之前,许多较小的网站并不总是使用 SSL 或 HTTPS。自那时起,对安全性的期望已经提高,Let’s Encrypt 项目应运而生,以便为大规模提供免费的受信任的 SSL 证书,几乎使每个人都能够根据需要使用 HTTPS。
然而,Let’s Encrypt 的证书存在一些限制。它们每 3 个月过期一次,通常需要您拥有一个正常运行的自动更新脚本,并且在无法实现此目标的环境中可能会很麻烦。Let’s Encrypt 也不提供扩展验证证书,用于验证您网站的法律所有权,或者通配符证书,它将自动匹配您网站的每个可能的子域(例如 shop.example.com),而无需您手动注册每个子域。
对于大多数用户来说,这些都不会是重大的限制。Let’s Encrypt 是许多个人和商业网站的热门选择。但是,如果您有特定的企业软件要求,或者是一个非常大型的商业运营,您应该考虑从商业 CA 购买证书。
本教程涵盖了如何选择并部署来自受信任证书颁发机构的 SSL 证书。在您获取了 SSL 证书之后,本教程将介绍如何在 Nginx 和 Apache Web 服务器上安装它。
先决条件
从商业 CA 获取 SSL 证书有几个先决条件:
- 注册的域名。本教程将始终使用
example.com
。您可以从 Namecheap 购买域名,也可以通过 Freenom 免费获取,或者使用您选择的域名注册商。 - 访问您域名的 WHOIS 记录中的一个电子邮件地址,或者访问域名本身的“管理员类型”电子邮件地址。颁发 SSL 证书的证书颁发机构通常会通过向域的 WHOIS 记录中的一个地址或者向域本身的通用管理员电子邮件地址发送验证电子邮件来验证域控制权。要获得扩展验证证书,您还需要向 CA 提供文件以建立网站所有者的法律身份,等等。
- 为您的服务器设置 DNS 记录。如果您使用 DigitalOcean,请参阅我们的 DNS 文档,了解如何添加它们。
本教程将为通过遵循 Ubuntu 22.04 初始服务器设置教程设置的 Ubuntu 22.04 服务器提供配置说明,包括启用 sudo 的非root用户和防火墙。大多数现代 Linux 版本将类似工作。
您还应该安装像 Nginx 或 Apache 这样的 Web 服务器,遵循《如何在 Ubuntu 22.04 上安装 Nginx》或《如何在 Ubuntu 22.04 上安装 Apache Web 服务器》。确保您为您的域设置了服务器块(或 Apache 虚拟主机)。
步骤 1 – 选择您的证书颁发机构
如果您不确定要使用哪个证书颁发机构,有几个因素需要考虑。
根证书计划成员资格
最关键的一点是您选择的 CA 是否是最常用操作系统和 Web 浏览器的根证书计划成员,即它是一个“受信任”的 CA,并且其根证书受到常见浏览器和其他软件的信任。如果您网站的 SSL 证书由受信任的 CA 签名,那么它的身份将被信任该 CA 的软件视为有效。
您遇到的大多数商业 CA 都将是常见根 CA 计划的成员,但在购买证书之前检查一下也无妨。例如,苹果发布了其受信任的 SSL 根证书列表。
证书类型
确保您选择的 CA 提供您需要的证书类型。许多 CA 在各种名称和定价结构下提供这些证书类型的变体。以下是每种类型的简要描述:
- 单域:用于单个域,例如
example.com
。请注意,不包括额外的子域,例如www.example.com
- 通配符:用于一个域及其任何子域。例如,
*.example.com
的通配符证书也可用于www.example.com
和store.example.com
- 多域:也称为 SAN 或 UC 证书,可用于添加到主题备用名称字段的多个域和子域。例如,单个多域证书可用于
example.com
、www.example.com
和example.net
除了上述证书类型外,CA 还提供不同级别的验证:
- 域验证(DV):CA 在验证请求者拥有或控制相关域后颁发 DV 证书
- 组织验证(OV):只有在颁发 CA 验证请求者的法律身份后才能颁发 OV 证书
- 扩展验证(EV):只有在颁发 CA 根据严格的一套指南验证请求者的法律身份等内容后才能颁发 EV 证书。此类证书的目的是向您网站的访问者提供对您组织身份的合法性的额外保证。EV 证书可以是单域或多域,但不能是通配符证书
附加功能
许多 CA 提供了各种“额外”功能,以使自己与其余 SSL 证书发行供应商区分开来。其中一些功能最终可能会为您节省资金,因此在购买之前权衡您的需求与所提供的功能非常重要。例如,要注意的功能包括免费证书重新签发或单域价格证书,适用于 www.
和域基本名称,例如 www.example.com
,带有 example.com
的 SAN。
步骤 2 – 生成 CSR 和私钥
在准备好先决条件并确定所需证书类型之后,现在是时候生成证书签名请求(CSR)和私钥了。
如果您计划将 Apache HTTP 或 Nginx 作为您的 Web 服务器,您可以使用 openssl
命令在 Web 服务器上生成私钥和 CSR。在本教程中,您可以将所有相关文件保存在您的主目录中,但可以随意将它们存储在服务器上的任何安全位置:
要生成名为 example.com.key
的私钥和名为 example.com.csr
的 CSR,请运行以下命令(将 example.com
替换为您的域名):
openssl req -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr
在这一点上,您将被提示输入几行信息,这些信息将包含在您的证书请求中。最重要的部分是“通用名称”字段,它应与您希望使用证书的名称匹配 – 例如,example.com
,www.example.com
,或(对于通配符证书请求)*.example.com
。如果您计划获取 OV 或 EV 证书,请确保所有其他字段准确反映您的组织或业务详细信息。提供“挑战密码”是不必要的。
例如:
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:example.com Email Address []:sammy@example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
这将生成一个 .key
和 .csr
文件。.key
文件是您的私钥,应保持安全。.csr
文件是您将发送给 CA 以请求 SSL 证书的文件。
ls example.com*
example.com.csr example.com.key
在提交证书请求给您的 CA 时,您需要复制并粘贴您的 CSR。要打印 CSR 的内容,请使用 cat
:
cat example.com.csr
现在您已经准备好从 CA 购买证书了。
步骤 3 – 购买和获取证书
有许多商业 CA 提供商,您可以比较和对比最适合您自己设置的选项。例如,Namecheap 作为 SSL 证书转售商,并且过去已更改上游 CA 提供商以提供最佳价值。目前,他们提供来自 Comodo CA 的证书。以下是他们截至 2022 年 12 月的一些样本:
!Namecheap SSL Offerings
在做出选择后,您需要上传在上一步中生成的 CSR。您的 CA 提供商还可能会有一个“批准者”步骤,该步骤将向您域的 WHOIS 记录中的地址或向您获取证书的域的 管理员 类型地址发送验证请求电子邮件。
在批准证书后,证书将通过电子邮件发送给指定的管理员。将它们复制并保存到与您生成私钥和 CSR 相同的位置。将证书命名为域名和 .crt
扩展名,例如 example.com.crt
,并将中间证书命名为 intermediate.crt
。
现在证书已准备好安装到您的 Web 服务器上,但首先,您可能需要对防火墙进行一些更改。
步骤 4 – 更新防火墙以允许 HTTPS
如果您已经按照我们的 Ubuntu 22.04 设置指南建议启用了 ufw
防火墙,则需要调整设置以允许 HTTPS 流量。Nginx 和 Apache 在安装时都会向 ufw
注册一些配置文件。
您可以通过输入以下命令查看当前设置:
sudo ufw status
如果您收到包含只有 Nginx HTTP
或 Apache
的输出,那么只允许 HTTP 流量访问 Web 服务器:
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
要额外允许 HTTPS 流量,允许 Nginx Full
或 Apache Full
配置文件,并删除多余的 HTTP 配置文件允许:
sudo ufw allow 'Nginx Full' sudo ufw delete allow 'Nginx HTTP'
这将产生以下结果:
sudo ufw status
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
在最后一步中,您将安装证书。
步骤 5 – 在服务器上安装证书
在从您选择的 CA 获取证书之后,您需要将其安装在您的 Web 服务器上。这涉及向您的 Web 服务器软件配置中添加一些与 SSL 相关的行。
本教程将涵盖在 Ubuntu 22.04 上配置 Nginx 和 Apache,但大多数现代 Linux 发行版的操作方式类似。本教程还做出以下假设:
- 私钥、SSL 证书,如果适用,CA 的中间证书位于主目录
/home/sammy
- 私钥名为
example.com.key
- SSL 证书名为
example.com.crt
- 您的提供商返回的 CA 中间证书位于名为
intermediate.crt
的文件中
Nginx
以下是手动在 Nginx 上部署 SSL 证书的步骤。
如果您的 CA 只返回了一个中间证书,您必须创建一个包含您的证书和 CA 的中间证书的单个“链接”证书文件。
假设您的证书文件名为 example.com.crt
,您可以使用 cat
命令将文件连接在一起,创建一个名为 example.com.chained.crt
的组合文件:
cat example.com.crt intermediate.crt > example.com.chained.crt
使用 nano
或您喜欢的文本编辑器,打开默认的 Nginx 服务器块文件进行编辑:
sudo nano /etc/nginx/sites-enabled/default
找到 listen
指令,并将其修改为 listen 443 ssl
:
… server { listen 443 ssl; …
接下来,在同一服务器块中找到 server_name
指令,并确保其值与您的证书的通用名称匹配。另外,添加 ssl_certificate
和 ssl_certificate_key
指令以指定证书和私钥文件的路径:
… server_name example.com; ssl_certificate /home/sammy/example.com.chained.crt; ssl_certificate_key /home/sammy/example.com.key; …
为了仅允许最安全的 SSL 协议和密码,向文件添加以下行:
… ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; …
最后,为了默认将 HTTP 请求重定向到 HTTPS,您可以在文件顶部添加一个额外的服务器块:
server { listen 80; server_name example.com; rewrite ^/(.*) https://example.com/$1 permanent; } …
保存并关闭文件。如果您使用的是 nano
,按 Ctrl+X
,然后在提示时按 Y
,然后按 Enter。
在重新启动 Nginx 之前,您可以使用 nginx -t
验证您的配置:
sudo nginx -t
如果没有任何问题,重新启动 Nginx 以启用 HTTPS 上的 SSL:
sudo systemctl restart nginx
通过 HTTPS 访问您的站点进行测试,例如 https://example.com
。您还需要尝试通过 HTTP 进行连接,例如 http://example.com
,以确保重定向正常工作。
Apache
以下是手动在 Apache 上部署 SSL 证书的步骤。
使用 nano
或您喜欢的文本编辑器,打开默认的 Apache 虚拟主机文件进行编辑:
sudo nano /etc/apache2/sites-available/000-default.conf
找到 <VirtualHost *:80>
条目,并修改它以便您的 Web 服务器将侦听端口 443
:
… <VirtualHost *:443> …
接下来,如果不存在,添加 ServerName
指令:
… ServerName example.com …
然后添加以下行以指定您的证书和密钥路径:
… SSLEngine on SSLCertificateFile /home/sammy/example.com.crt SSLCertificateKeyFile /home/sammy/example.com.key SSLCACertificateFile /home/sammy/intermediate.crt …
此时,您的服务器已配置为仅侦听 HTTPS(端口 443),因此不会提供 HTTP(端口 80)的请求。为了将 HTTP 请求重定向到 HTTPS,将以下内容添加到文件顶部(在两个位置替换名称):
<VirtualHost *:80> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost> …
保存并关闭文件。如果您使用的是 nano
,按 Ctrl+X
,然后在提示时按 Y
,然后按 Enter。
通过运行以下命令启用 Apache SSL 模块:
sudo a2enmod ssl
现在,重新启动 Apache 以加载新配置并启用 TLS/SSL 上的 HTTPS。
sudo systemctl restart apache2
通过 HTTPS 访问您的站点进行测试,例如 https://example.com
。您还需要尝试通过 HTTP 进行连接,例如 http://example.com
,以确保重定向正常工作。
结论
在本教程中,您学习了如何确定何时需要从商业 CA 购买 SSL 证书,以及如何比较和对比可用的选项。您还学习了如何配置 Nginx 或 Apache 以支持 HTTPS,并如何调整它们的配置以适用于生产环境。
接下来,您可能希望阅读有关其他 SSL 使用情况的文章,比如在使用负载均衡器时。