问题描述
我通常使用此参数来防止 wp_remote_get
和 wp_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。