Facebook - 卷曲错误 SSL_CACERT SSL 证书
Posted
技术标签:
【中文标题】Facebook - 卷曲错误 SSL_CACERT SSL 证书【英文标题】:Facebook - Curl Error SSL_CACERT SSL certificate 【发布时间】:2019-01-24 23:56:36 【问题描述】:当通过 https 向 Facebook 询问 scrape my page 时,我收到“Curl 错误:SSL_CACERT SSL 证书问题:无法获取本地颁发者证书”。我该如何解决这个问题,以便 Facebook 可以准确无误地抓取我的页面?
该页面通过 Apache 2.4 代理到 IIS 10 托管。Apache 处理所有证书,而 IIS 位于本地网络上。我的页面正在运行 asp 代码(所以没有 php)和类似于这些的解决方案:edit the php.ini file 或 adding curl.pem to php folder 将无法解决我的问题......或者我认为?!?
IIS 没有安装证书。
我确实启用了extension=php_curl.dll
-- 并且在我的 php.ini 文件中定义了extension_dir = 'C:\64bit\php-7.0.6-Win32-VC14-x64\ext'
。我跟着 these steps 在 Windows 上安装 Curl。并且 phpinfo.php 确认 cURL 已启用(cURL 信息 7.47.1)。
我的 Apache 配置文件中的代理设置是:
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://192.168.1.101:88/com_ssl/
ProxyPassReverse / http://192.168.1.101:88/com_ssl/
RewriteRule ^(.+)$ https://www.domainname.com/$1 [P,L]
</IfModule>
我的 Apache 代理配置文件 such as suggested here in Step 10 中没有定义 RequestHeader:
RequestHeader set "X-RP-UNIQUE-ID" "%UNIQUE_IDe"
RequestHeader set "X-RP-REMOTE-USER" "%REMOTE_USERe"
RequestHeader set "X-RP-SSL-PROTOCOL" "%SSL_PROTOCOLs"
RequestHeader set "X-RP-SSL-CIPHER" "%SSL_CIPHERs"
这是修复错误所缺少的吗?
【问题讨论】:
您可以使用ssllabs.com/ssltest 来测试您的设置。 @WizKid 谢谢你的链接。我得到了一个 F - 多么令人震惊!我不知道。我将 Apache 从 2.4.20 更新到 2.4.36,这让我升到了 B。之后我注释掉SSLCertificateChainFile
,这让我升到了A。 (我不确定是否由于中间证书问题触发了 Facebook 错误。)
【参考方案1】:
当时可能不是这种情况,但我会添加此信息以防其他人遇到同样的问题。
如果您使用 CDN,例如 cloudflare,请务必在添加到 cloudflare 之前设置您的 SSL,因为它可能会产生问题。
确保在 cloudflare 的 DNS 控制中正确注释所有域也很重要,否则您最终可能会通过 cloudflare 为您的主域提供服务,而您的子域直接从您的服务器提供服务。虽然这对用户来说并不重要(仍然显示安全、仍然可以访问、仍然通过 SSL 测试),但它可能会标记在社交媒体上共享应用程序的问题。基本上,我通过如上所述拆分 DNS 设置来复制错误,并实现了操作突出显示的标记错误。然后我将子域的 DNS 添加到 cloudflare,几个小时后测试(在 debudder 中重置页面后:https://developers.facebook.com/tools/debug/sharing/?q=https%3A%2F%2Fus.icalculator.info%2Fterminology%2Fus-tax-tables%2F2019%2Fvirginia.html)。而且,嘿,错误发生了。因此,如果您遇到该问题并使用 cloudflare,则需要检查您是否已正确设置。
【讨论】:
【参考方案2】:如果您使用的是 nodejs 服务器并收到此错误“Curl Error SSL_CACERT SSL certificate”,那么您需要添加您的 CA 以及您的 SSL CRT。
var fs = require('fs');
var https = require('https');
var options =
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-crt.pem'),
ca: fs.readFileSync('ca-crt.pem'), // <= Add This
;
https.createServer(options, function (req, res)
console.log(new Date()+' '+
req.connection.remoteAddress+' '+
req.method+' '+req.url);
res.writeHead(200);
res.end("hello world\n");
).listen(4433);
【讨论】:
您的解决方案实际上并没有帮助我,但它为我指明了解决问题的正确方向。结果是cert
字段我必须导入fullchain.pem
文件,而不是cert.pem
文件(奇怪的letsencrypt 命名约定)【参考方案3】:
“无法获取本地颁发者证书”几乎总是当服务器没有提供intermediate certificate 时收到的错误消息,正如它在 TLS 握手中应该提供的那样,并且正如 WizKid 建议的那样,针对服务器确实会告诉您是否是这种情况。
【讨论】:
我也认为这是最有可能的问题。我过去使用以下工具进行检查,发现使用起来非常简单/快速(比您建议的 Qualys 检查快得多):whatsmychaincert.com (***.com/a/49050648/7362396)以上是关于Facebook - 卷曲错误 SSL_CACERT SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章
使用ShareFile FTP Link的Facebook商品Feed计划 - 卷曲错误56
PHP中的Facebook Graph API出现不一致的错误 - 无法连接到graph.facebook.com端口443:连接超时