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:连接超时

卷曲错误:没有路由到主机

卷曲错误代码 7

卷曲导致openssl错误

php 卷曲错误处理程序