问题描述

我通常使用此参数来防止 wp_remote_getwp_remote_post 发生错误

array(
    'sslverify' => false
)

出于安全考虑,我想将其设置为 true(或者从默认值为 true 时将其删除) 。

我应该期待这样做有什么问题吗?

最佳解决方案

长话短说:是的,从 WordPress 3.7 或更高版本中删除该设置。

过去许多人特别添加了 sslverify = false 参数,因为它们的安装 PHP 无法正确验证证书。

通常,这是因为没有使用 CA 根证书的最新副本更新 PHP 安装。根证书每隔一段时间更改一次,通常您不会注意到此更改,因为它会在正常的浏览器更新中发生。那么当你的 PHP 像浏览器一样检索 https url,那么它也需要这些根证书更新。大多数主机从不更新 PHP,也不会更新其任何特定部分 (如证书文件) 。

当 WordPress 在 3.7 版中实现 auto-updating 时,确定需要升级 WordPress.org API 才能要求安全通信。此时,WordPress 开始包含源自 Mozilla 的 CA 根证书文件本身的副本。因此,由于 WordPress 3.7,因此 WP_HTTP API 函数使用此文件进行证书验证,而不是任何旧版或过时的版本与您的 PHP 安装一起打包。

因此,是的,使用 WordPress 3.7 或更高版本,建议删除 sslverify 参数并允许 http 功能进行正确的证书验证。任何运行 SSL 的现代服务器都会使用已知 CA 之一签名的密钥进行正确验证。 WP_HTTP 应具有最新根证书的副本,核心项目将随着正常更新一起更新 WordPress 中的证书文件。

次佳解决方案

有许多原因可以让 SSL 验证失败。从太多重定向到错误的.ini 文件/设置或简单地缺少证书或子域。无论如何,您将需要搜索原因并进行修复。没有办法。

但是要临时解决这个问题 (假设您需要进一步开发代码并稍后修复 SSL 错误),可以使用过滤器:

add_filter( 'https_ssl_verify', '__return_false' );

当您在远程请求期间运行此应用程序时,应将其包装在附加到在此类 HTTP 请求期间触发的过滤器的回调中。确保检查您是否正在删除正确案例的验证,并确保只运行一次,以不解除其他请求。

add_filter( 'http_request_args', function( $params, $url )
{
    // find out if this is the request you are targeting and if not: abort
    if ( 'foo' !== $params['foo'] )
         return $params;

    add_filter( 'https_ssl_verify', '__return_false' );

    return $params;
}, 10, 2 );

如果这是一个公开分发的插件,那么您可能希望将其附加到用户可以打开或关闭的简单选项。您也可以首先尝试验证的请求,如果没有 (如果用户已经选择了未签名的请求),则切换到潜在的不安全请求。

Rule of thumb:

Do never perform an unsecure request until your user has agreed to do so and knows of the risks.

第三种解决方案

WordPress 可以依靠底层服务器软件 (通常是 cURL) 来执行网络请求。简而言之,因为它是什么软件是好的,在那里。

在某些服务器上,由于各种原因 (我从来没有打扰过我自己),服务器软件无法使用”verify” 安全连接是非常典型的,从而产生错误。

所以:

  • 如果这是您控制的服务器上的专用代码,您应该确保服务器正在正确提出请求,并且此设置不被禁用

  • 如果这是公共发行的代码,你可能不想禁用它,但是如果它很受欢迎,它将在某个时候被破坏的服务器上结束,你必须以某种形式 (从告诉人们预期适当的配置可以为您的请求提供禁用设置,等等)

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。