WordPress HTTPS、SSL 和 TLS – 网站管理员指南

已发表: 2021-02-01

当您访问网站时,您的浏览器(也称为客户端)会向 Web 服务器发送 HTTP请求。 一旦 Web 服务器发送 HTTP响应,浏览器就可以将页面呈现到您的屏幕上。 但是,HTTP 流量存在问题; 它是一个明文协议。 这使得它容易受到窥探和干预。

如果攻击者与您在同一网络上,他们可以拦截并读取您的 HTTP 流量。 他们还可能修改您对服务器的请求,以及服务器对您的响应。 这被称为中间人 (MitM) 攻击。 这很容易在公共 WiFi 上发生,例如酒店大堂和公共场所的 WiFi。

这就是网站应该使用 HTTPS 的原因——这样流量就不会被拦截。 本文解释了什么是 HTTPS、SSL 和 TLS。 它还解释了如何配置 WordPress 网站以使用 HTTPS。

目录

  • 什么是 SSL 和 TLS?
  • 什么是 HTTPS?
    • HTTPS 是如何工作的?
      • TLS 握手
      • 公钥和私钥(密钥对)
  • 我的 WordPress 网站上真的需要 HTTPS 吗?
    • 获取 HTTPS TLS 证书(又名 SSL 证书)
    • 共享和托管 WordPress 主机上的 HTTPS
  • 配置 WordPress HTTPS
    • 配置 Web 服务器
    • 将 WordPress URL 配置为 HTTPS
    • 在 WordPress 仪表板上强制执行 TLS(额外提示)
  • 添加 HTTP 严格传输安全 (HSTS)
    • 在 Web 服务器上配置 HSTS
    • TLS 密码
    • 我的 WordPress 在 HTTPS 上运行,它安全吗?

什么是 SSL 和 TLS?

一旦互联网开始发展,很明显我们需要一种机制来在客户端和服务器之间安全地传输信息,而没有任何人能够窃听或修改流量——进入 SSL 或安全套接字层。 SSL 是一种 Internet 安全协议,最早由 Netscape 于 1995 年开发用于解决这个问题。

更具体地说,SSL 着手完成以下任务:

  • 加密——加密流量,使其不会被未经授权的第三方通过窃听拦截,
  • 身份验证——确保客户端正在与之交谈的服务器确实是他们所说的服务器,
  • 完整性——确保客户端和服务器之间发送的数据在此过程中不会被其他人修改。

然而,随着时间的推移,安全研究人员发现了 SSL 中的许多安全问题。 因此 SSL 被 TLS(传输层安全协议)取代。 虽然 SSL 和 TLS 之间的内在差异很大,但 TLS 的目的基本相同。

注意:您可能经常看到 SSL 被用来指代 TLS。 SSL 是一种遗留协议,不再安全使用。 然而,由于它的流行,许多人仍然使用 SSL 作为首字母缩略词,但它们的意思是 TLS 。

什么是 HTTPS?

HTTPS 或安全超文本传输​​协议是 HTTP 协议的安全版本。 HTTPS 依赖于传输层安全 (TLS),这是一种比以前使用的安全套接字层 (SSL) 改进且更安全的协议。 TLS 为 HTTPS 请求和响应提供加密、身份验证和完整性。

您可以将 HTTPS 视为通过 TLS隧道的 HTTP(即协议的明文版本)请求和响应。 这方面的技术术语是封装。 值得注意的是,TLS 可用于封装其他协议,而不仅仅是 HTTP。

您可以通过查看浏览器导航栏中 URL 的开头(以 HTTPS 开头)或绿色挂锁来发现使用 HTTPS 的网站。 如果您在 HTTP 上浏览网站,浏览器会将其标记为Not Secure

标记为不安全的 HTTP 网站

HTTPS 是如何工作的?

当您使用 HTTPS 请求网页时,您的浏览器和 Web 服务器会启动一个称为TLS 握手的过程。 TLS 握手是客户端和服务器决定是否以及如何通信的一种方式。 在 TLS 握手过程中,客户端和服务器执行以下操作:

  • 决定要使用的 TLS 协议的版本(TLS 1.0、1.2、1.3…),
  • 同意使用哪些密码套件(一组用于建立安全通信的加密算法),
  • 验证服务器的身份,
  • 在握手完成后生成要使用的加密密钥,以便安全地进行通信。

TLS 握手

在 TLS 握手期间,服务器向客户端发送它的证书,以便客户端验证他们是否可以对服务器进行身份验证。 证书类似于护照——它由称为证书颁发机构 (CA) 的受信任的中央机构颁发,该机构独立建立网站的身份,可以向您的浏览器证明。

公钥和私钥(密钥对)

Web 服务器发送给客户端的 TLS 证书(通常称为 SSL 证书)包含公钥公钥是称为keypair的两个特殊密钥之一。 密钥对由两个密钥组成; 公钥私钥。 虽然公钥与客户端共享,但私钥在服务器上是保密的,永远不会泄露。 密钥对是一起伪造的。

公钥和私钥对有一个特别有趣的关系——在不知道服务器的私钥的情况下(这是秘密的,只有服务器应该知道),客户端可以使用服务器的公钥加密数据,服务器可以使用它的私钥解密.

如果这听起来令人困惑,可以将其想象为“服务器”向您的“浏览器”发送了一个用挂锁保护的打开手提箱(公钥)——一旦您将东西放入手提箱并锁上挂锁,只有“服务器”与挂锁的钥匙(私钥)可以看到里面的东西。

我的 WordPress 网站上真的需要 HTTPS 吗?

是的。 无论您的网站提供何种流量(无论是个人身份信息 (PII)、持卡人数据还是猫图片),您绝对没有理由不通过 HTTPS 为您的网站提供服务。

首先,当您在 HTTP 上运行您的网站时,黑客可以轻松窃取您的 WordPress 密码和凭据并侵入您的网站。 他们可以使用免费提供的工具来完成所有这些工作。

除了安全优势和更好的用户体验之外,如果没有 TLS,Web 浏览器中就无法使用新的 HTTP/2 协议,它提供了一些性能优势。 此外,HTTPS 还具有搜索引擎优化 (SEO) 优势,并且是 Google 搜索排名算法的一部分。

获取 HTTPS TLS 证书(又名 SSL 证书)

如果您自己设置所有内容,则要设置 HTTPS,您将需要 TLS 证书。 虽然您会看到数十种付费 TLS 证书产品,但您可以从名为 Let's Encrypt 的非营利性证书颁发机构获得免费的 TLS 证书。 您从 Let's Encrypt 免费获得的证书与您付费获得的证书之间绝对没有什么不同。

共享和托管 WordPress 主机上的 HTTPS

请注意,对于托管或共享托管解决方案,您的托管服务提供商可能会或可能不会对添加 HTTPS 收费——如果是这种情况,在花钱购买证书之前,请询问他们的客户支持是否可以使用 Let's Encrypt 证书和他们的而是服务。 Let's Encrypt 社区论坛也是一个很好的资源,可以帮助您。

配置 WordPress HTTPS(在您的 WordPress 站点中强制执行 TLS)

根据您的设置,有几种方法可以在您的 WordPress 网站上强制执行 TLS。 在大多数情况下,您可以将 Web 服务器配置为将所有 HTTP 流量重定向到 HTTPS(请参阅 Mozilla 的 SSL 配置生成器。

您还需要配置 WordPress 以侦听 HTTPS。 您可以使用真正简单的 SSL 或 WP force SSL 等插件来做到这一点。 在这个例子中,我们将看到如何在不使用任何额外插件的情况下做到这一点。

配置 Web 服务器

当心

  • 复制/粘贴 Web 服务器配置时要小心,并通过查阅 Web 服务器的文档确保您确切知道它们在做什么
  • 您可能会在网上找到许多使用 %{HTTP_HOST}(Apache HTTP 服务器)或 $http_host(Nginx)的示例——这两种方法都可能使您的网站容易受到 HTTP 主机头攻击——相反,请在配置中输入您的主机名,如图所示以下。

如果您使用的是 Nginx,您可以配置以下内容:

server {
  listen 80;
  server_name example.com www.example.com;
  return 301 https://example.com$request_uri;
}

或者,如果您使用的是 Apache HTTP Server,您可以配置以下内容:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://www.example.com%{REQUEST_URI} [L,R=301]
<IfModule>

将 WordPress URL 配置为 HTTPS

在 Web 服务器上启用 HTTPS 后,您还需要设置 WordPress。 理论上您可以手动执行此操作:只需在 WordPress 常规设置中更改 WordPress 地址和站点地址。 您还需要在数据库中进行搜索和替换,以将所有网站链接从 HTTP 更改为 HTTPS。

[截屏]

所以很可能使用插件将您的 WordPress 网站切换到 HTTPS 要容易得多。 您可以使用像真正简单的 SSL 这样的流行插件来帮助您完成整个过程。

在 WordPress 仪表板上实施 TLS

TLS 只有在使用时才有用。 因此,您要确保您的 WordPress 站点不仅支持 TLS,而且还强制执行它。 由于必须始终通过 HTTPS 访问 WordPress 仪表板,因此 WordPress 包含特殊的配置选项 FORCE_SSL_ADMIN,可以在 wp-config.php 中将其设置为 true。

define('FORCE_SSL_ADMIN', true);

当心

  • 根据您的网站设置和配置(特别是,如果您使用反向代理),这可能会导致对您的 WordPress 仪表板的请求进入无限重定向循环。 有关如何解决此问题的更多信息,请参阅 WordPress 文档,并始终在暂存环境中测试您的更改,然后再将它们推广到生产环境。
  • 此外,在将 FORCE_SSL_ADMIN 设置为 true 之前,请确保您已经配置了 TLS 并正常工作。

奖励提示 1:添加 HTTP 严格传输安全 (HSTS)

虽然将所有流量重定向到 HTTPS 是一个很好的举措,但不幸的是,攻击者可能仍有一些技巧。 一种称为 SSL 剥离的攻击将允许攻击者欺骗浏览器以 HTTP 而不是安全的 HTTPS 浏览站点,从而完全破坏您的辛勤工作。

有关 SSL 条带攻击的更多(高度技术性)细节,请观看下面 Moxie Marlinspike 的演讲。

因此,浏览器现在实现了 HTTP 严格传输安全性或 HSTS。 HSTS 只不过是一个简单的 HTTP 标头,它告诉浏览器永远不应通过 HTTP 访问该特定网站,从而击败任何 SSL 条带攻击。

在 Web 服务器上配置 HSTS

当心

  • 在您对 HTTPS 有信心之前不要启用 HSTS - 任何收到此 HTTP 标头的访问者都只能通过 HTTPS 查看您的网站
  • 始终设置 max-age 属性 — 可选地,您可以选择在第一次部署 HSTS 时设置一个较低的值(以限制任何潜在问题),并在您更有信心使用 HSTS 时增加它

如果您使用的是 Nginx,您可以在监听端口 443 的服务器块中配置以下内容:

# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;

或者,如果您使用的是 Apache HTTP Server,您可以在 VirtualHost 中配置以下内容,侦听端口 443:

# HTTP Strict Transport Security (mod_headers is required) 
(63072000 seconds)
Header always set Strict-Transport-Security "max-age=63072000"

额外提示 2:配置 TLS 密码

为确保浏览器和服务器之间的数据传输是安全的,双方同意使用所谓的密码套件(身份验证、加密和消息身份验证代码 (MAC) 算法的组合)来协商安全设置,以及安全地传输数据。

不幸的是,许多遗留密码存在安全漏洞,并且不再特别安全。 虽然决定使用哪些密码是一项棘手的工作,但 Mozilla SSL 配置生成器让选择适合您需求的 TLS 密码套件变得轻而易举。 在可能的情况下,尝试使用现代或中间配置文件,但是,根据您的用例,特别是如果您需要支持旧版浏览器或满足法规和合规性要求,您可能需要使用略有不同的密码套件配置。

如果您使用的是 Nginx,则可以配置以下 TLS 密码(基于 Mozilla SSL 配置生成器中间配置文件):

 # intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES25
6-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDH
E-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

或者,如果您使用的是 Apache HTTP Server,则配置以下 TLS 密码(基于 Mozilla SSL 配置生成器中间配置文件):

# intermediate configuration
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off

您还可以使用名为 SSLabs 的免费工具测试您网站的 TLS 配置分数,以获得更多技术见解。

我的 WordPress 在 HTTPS 上运行,它安全吗?

绿色挂锁图标和浏览器地址栏旁边的“安全”字样可能使您相信 HTTPS 是解决所有网站安全问题的魔杖。 不幸的是,事实并非如此。 浏览器栏中的绿色挂锁

HTTPS 只是 WordPress 安全性的一小部分:它允许访问者通过安全连接浏览您的网站。 但是,它不会像 WordPress 防火墙那样保护您的网站,也不会使其更安全。 这并不意味着它比在 HTTP 上运行的网站更安全。 与任何其他安全防御措施一样,HTTPS 有助于解决部分问题。

换句话说,虽然您当然应该实施和强制实施 HTTPS,但这并不意味着您可以高枕无忧,不再担心安全问题。 你仍然应该:

  • 添加双重身份验证
  • 安装文件完整性监控插件
  • 实施强大的 WordPress 密码策略
  • 保留 WordPress 活动日志作为您网站上发生的所有更改的记录
  • 使用好的防火墙。