HTTPS

HTTPS 是一种加密通信协议——本质上是一种更安全的网络浏览方式,因为您可以直接在浏览器和网络服务器之间建立私人通道。这就是为什么大多数主要网站都使用它的原因。

如果站点使用 HTTPS,您会在地址字段中看到一个小挂锁图标,如下面的屏幕截图所示:

“安全站点”挂锁图标的屏幕截图

以下是您可能希望在自己的网站上使用 HTTPS 的最常见原因:

**快点。**有人可能会认为 HTTPS 会使您的站点变慢,因为它需要一些时间来加密和解密所有数据。但是很多对 HTTP 的效率提升只有在你使用 HTTPS 的时候才有。因此,HTTPS 实际上会让您的网站对几乎所有访问者来说都更快。

**相信。**用户发现更容易信任安全站点。虽然他们不一定知道他们的流量已加密,但他们知道小挂锁图标表示网站关心他们的隐私。技术人员会知道,您的计算机和 Web 服务器之间的任何服务器都无法看到来回流动的信息,也无法更改它。

**支付安全。**如果您在网站上出售任何东西,用户希望知道他们的付款信息是安全的。HTTPS 和小挂锁确保他们的信息安全地传输到 Web 服务器。

**搜索引擎优化。**许多搜索引擎会对不使用 HTTPS 的网站增加惩罚,从而使其更难达到搜索结果中的最佳位置。

你的好名字 您是否注意到某些网站的地址旁边有“不安全”字样?

当您的网络浏览器想让您知道某个站点未使用 HTTPS 时,就会发生这种情况。浏览器希望您认为(正确!)那些不愿使用 HTTPS(在许多情况下是免费的)的网站所有者不值得您花时间,当然也不值得您花钱。

反过来,您不希望浏览器暗示您自己可能是那种可疑的网站所有者。

通过 HTTPS 管理

要通过 SSL 轻松启用(和强制执行)WordPress 管理,您可以在站点的wp-config.php文件中定义两个常量。在插件文件中定义这些常量是不够的;它们必须在您的wp-config.php文件中定义。您还必须已经在服务器上配置了 SSL 并为安全服务器配置了一个(虚拟)主机,然后您的站点才能正常工作并将这些常量设置为 true。

注意:在 4.0 版FORCE_SSL_LOGIN中已弃用。请使用。FORCE_SSL_ADMIN

强制 HTTPS 登录和 HTTPS 管理员访问

可以在文件中将该常量FORCE_SSL_ADMIN设置为 truewp-config.php以强制所有登录所有管理会话都通过 SSL 进行。

例子

define( 'FORCE_SSL_ADMIN', true );

使用反向代理

如果 WordPress 在提供 SSL 的反向代理后面托管,但在没有 SSL 的情况下自行托管,这些选项最初会将任何请求发送到无限重定向循环中。为避免这种情况,您可以配置 WordPress 以识别HTTP_X_FORWARDED_PROTO标头(假设您已正确配置反向代理来设置该标头)。

例子

define( 'FORCE_SSL_ADMIN', true );
// in some setups HTTP_X_FORWARDED_PROTO might contain 
// a comma-separated list e.g. http,https
// so check for https existence
if( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false )
    $_SERVER['HTTPS'] = 'on';

更多信息

如果您使用的是旧版本的 WordPress(理想情况下您不应该使用!)或您的 SSL 设置有些不同(即您的 SSL 证书用于不同的域),本文的其余部分将用作信息。

有时,您希望整个 wp-admin 使用 https 协议在安全连接上运行。从概念上讲,该过程是这样工作的:

  1. 使用相同的 url(博客 url)设置两个虚拟主机,一个安全,另一个不安全。
  2. 在安全的虚拟主机上,设置一个重写规则,将所有非 wp-admin 流量传送到不安全的站点。
  3. 在不安全的虚拟主机上,设置一个重写规则,将所有流量传送到 wp-admin 到安全主机。
  4. 放入一个过滤器(通过插件)来过滤 wp-admin 中的链接,这样一旦激活,管理链接就会被重写为使用 https 并且编辑 cookie 以仅在加密连接上工作。

以下指南适用于 WordPress 1.5 和 Apache 运行,在(而不是文件)mod_rewrite中使用重写规则,但可以轻松修改以适应其他托管场景。httpd.conf``.htaccess

虚拟主机

除了非安全站点之外,您还需要为安全服务器配置的(虚拟)主机。在此示例中,安全虚拟主机使用DocumentRoot与不安全主机相同的内容。假设您可以使用具有不同名称的主机,例如 wpadmin.mysite.com 并将文档根目录链接到 wpadmin 目录。

请让您的 ISP 为您设置一个安全的虚拟主机,或者如果您有管理权限,请设置您自己的虚拟主机。请注意,您不能使用基于名称的虚拟主机来识别不同的 SSL 服务器。

为不安全的主机重写规则

在您的不安全主机的.htaccess或虚拟主机节中,添加此重写规则以在您浏览到 http://example.com/wp-admin/ 或 http://example.com/wp- 时自动转到安全主机httpd.conf登录.php

这应该在主要的 wordpress 重写块之上。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)\ HTTP/ [NC]
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^/?(wp-admin/|wp-login\.php) https://example.com%{REQUEST_URI}%{QUERY_STRING} [R=301,QSA,L]

如果您正在使用永久链接重写规则,则此行必须位于 之前RewriteRule ^.*$ - [S=40]

此块中的一个重要想法是使用THE_REQUEST,它确保只重写实际的 http 请求,而不是本地直接文件请求,如 include 或 fopen。

重写安全主机规则(可选)

这些重写规则是可选的。他们禁止通过安全连接访问公共站点。如果您希望使用以下插件保持登录到您网站的公共部分,则不得_添加_这些规则,因为该插件会禁用未加密连接上的 cookie。

安全虚拟主机应该在 .htaccess 文件或虚拟主机声明中有两个重写规则(有关重写的更多信息,请参阅使用永久链接):

RewriteRule !^/wp-admin/(.*) - [C]
RewriteRule ^/(.*) http://www.example.com/$1 [QSA,L]

第一条规则将 wp-admin 目录排除在下一条规则之外,该规则将安全站点的流量转移到不安全的站点,以便为您的受众保持良好和无缝的连接。

设置 WordPress URI

为了使某些插件正常工作,以及出于其他原因,您可能希望通过设置 https://example.com 来在选项中设置 WordPress URI 以反映 https 协议。您的博客地址不应更改。

示例配置节

注意:以下配置并非 100% 兼容 WordPress 2.8+,WordPress 2.8 使用 wp-includes 文件夹中的一些文件。第一组重写规则引入的重定向可能会导致某些用户出现安全警告。有关详细信息,请参阅#10079 。

<VirtualHost nnn.nnn.nnn.nnn:443>
    ServerName www.example.com
    SSLEngine On
    SSLCertificateFile /etc/apache2/ssl/thissite.crt
    SSLCertificateKeyFile /etc/apache2/ssl/thissite.pem
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    DocumentRoot /var/www/mysite
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule !^/wp-(admin|includes)/(.*) - [C]
        RewriteRule ^/(.*) http://www.example.com/$1 [QSA,L]
    </IfModule>
</VirtualHost>

不安全的网站

<VirtualHost *>
    ServerName www.mysite.com
    DocumentRoot /var/www/ii/mysite
    <Directory /var/www/ii/mysite >
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteCond %{REQUEST_FILENAME} -f [OR]
            RewriteCond %{REQUEST_FILENAME} -d
            RewriteRule ^wp-admin/(.*) https://www.example.com/wp-admin/$1 [C]
            RewriteRule ^.*$ - [S=40]
            RewriteRule ^feed/(feed|rdf|rss|rss2|atom)/?$ /index.php?&feed=$1 [QSA,L]
        </IfModule>
    </Directory>
</VirtualHost>

重写登录和注册

使用 SSL 进行用户登录和注册可能是个好主意。考虑以下替代 RewriteRules。

缺乏安全感

RewriteRule ^/wp-(admin|login|register)(.*) https://www.example.com/wp-$1$2 [C]

安全的

RewriteRule !^/wp-(admin|login|register)(.*) - [C]

重写在端口 443 或端口 80 上运行的站点

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# For a site running on port 443 or else (http over ssl)
RewriteCond %{SERVER_PORT} !^80$
RewriteRule !^wp-(admin|login|register)(.*) - [C]
RewriteRule ^(.*)$ http://%{SERVER_NAME}/$1 [L]
# For a site running on port 80 (http)
RewriteCond %{SERVER_PORT}  ^80$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^wp-(admin|login|register)(.*) https://%{SERVER_NAME}:10001/wp-$1$2 [L]
RewriteCond %{SERVER_PORT}  ^80$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

概括

此方法不能_修复_WordPress 中的一些固有安全风险,也不能保护您免受中间人攻击或其他可能削弱安全连接的风险。

但是,这_应该_会使恶意人员更难窃取您的 cookie 和/或身份验证标头并使用它们来冒充您并获得对 wp-admin 的访问权限。它还混淆了嗅探您的内容的能力,这对于可能具有需要严格保护的文档草稿的合法博客来说可能很重要。

确认

在作者的服务器上,日志表明 GET 和 POST 请求都通过 SSL,并且所有到不安全主机上的 wp-admin 的流量都被传送到安全主机。

示例 POST 日志行:

[Thu Apr 28 09:34:33 2005]  Subsequent (No.5) HTTPS request received for child 6 (server foo.com:443)
xx.xxx.xxx.xxx - - [28/Apr/2005:09:34:33 -0500] "POST /wp-admin/post.php HTTP/1.1" 302 - "https://foo.com/wp-admin/post.php?action=edit&post=71" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3"

更多的测试,最好是使用数据包嗅探器和一些核心网络分析工具,将有助于确认。

限制

作者假设(但尚未检查)如果用户已存储 cookie/告诉他们的浏览器记住密码(不是基于表单字段,而是如果使用某些外部身份验证机制)并点击 http://www.example.com/ wp-admin/,这些数据包以明文形式发送,并且可以拦截 cookie/auth 标头。因此,为确保最大安全性,用户应明确使用 https 主机或始终在新会话开始时登录。

变更日志

  • 2022-10-25:来自Why should I use HTTPS和Administration Over SSL 的原始内容。