介绍
本教程将向您展示如何从受信任的商业证书颁发机构(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记录中的一个地址或者向域名本身的通用管理员电子邮件地址发送验证电子邮件来验证域控制。要获得扩展验证证书,您还需要向证书颁发机构提供文件,以建立网站所有者的法律身份等信息。
-
为您的服务器设置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必须是最常用操作系统和网络浏览器的根证书程序的成员,也就是说,它是一个“受信任”的CA,其根证书被常用的浏览器和其他软件信任。如果您网站的SSL证书由受信任的CA签发,那么在信任该CA的软件中,其身份被认为是有效的。
您将遇到的大多数商业CA都将是常见根CA程序的成员,但在购买证书之前最好检查一下。例如,Apple发布了其受信任的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):DV证书是在CA验证请求者拥有或控制相关域名后颁发的。
- 组织验证(OV):OV证书只有在签发CA验证请求者的法定身份后才能颁发。
- 扩展验证(EV):EV证书只有在签发CA根据严格的一套准则验证请求者的法定身份等信息后才能颁发。这种类型的证书的目的是向您网站的访问者提供额外的组织身份合法性保证。EV证书可以是单域名或多域名,但不包括通配符。
附加功能
许多证书颁发机构提供各种“奖励”功能,以使自己与其他SSL证书颁发供应商区分开来。其中一些功能最终可能为您节省资金,因此在购买之前权衡您的需求与提供的功能至关重要。要注意的功能示例包括免费证书重新发行或适用于www。
和域基本名称的单域定价证书,例如www.example.com
,带有SAN的example.com
步骤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 证书,请确保所有其他字段准确反映您的组织或业务详细信息。提供“挑战密码”是不必要的。
例如:
OutputCountry 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 []:[email protected]
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*
Outputexample.com.csr example.com.key
在向 CA 提交证书请求时,您需要复制并粘贴您的 CSR。 要打印 CSR 的内容,请使用cat
:
cat example.com.csr
现在您已经准备好从 CA 购买证书了。
第三步 – 购买和获取证书
有许多商业 CA 供应商,您可以比较和对比最适合您设置的选项。例如,Namecheap 充当 SSL 证书经销商,并在过去更改上游 CA 供应商以提供最佳价值。目前,他们提供来自 Comodo CA 的证书。以下是截至 2022 年 12 月的一些样本:
在选择后,您将需要上传在先前步骤中生成的 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服务器:
OutputStatus: 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
OutputStatus: 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
的文件中。
注意:在生产环境中,这些文件应该存储在只有网页服务器进程(通常是root
)可以访问的地方,并且私钥应该保持安全。例如,Let’s Encrypt 将其生成的证书存储在/etc/letsencrypt
中。由于多服务器配置的复杂性,生产示例会有所不同。
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以加载新配置并在HTTPS上启用TLS/SSL。
- sudo systemctl restart apache2
通过HTTPS访问您的站点进行测试,例如https://example.com
。您还应该尝试通过HTTP连接,例如http://example.com
,以确保重定向正常工作。
结论
在本教程中,您学习了如何确定何时需要从商业CA购买SSL证书,以及如何比较和对比可用的选项。您还学习了如何为HTTPS支持配置Nginx或Apache,并如何调整它们的配置以供生产使用。
接下来,您可能想阅读关于其他SSL用例,例如在使用负载均衡器时。