Facebook - Curl错误 SSL_CACERT SSL证书

5
当我通过https请求Facebook来抓取我的页面时,我遇到了“Curl错误:SSL_CACERT SSL证书问题:无法获取本地颁发者证书”的问题。如何解决这个问题,让Facebook可以无错误地抓取我的页面?
该页面通过Apache 2.4代理到IIS 10进行托管。Apache处理所有证书,而IIS位于本地网络上。我的页面运行asp代码(因此没有php),类似这些解决方案:编辑php.ini文件将curl.pem添加到php文件夹中将无法解决我的问题...至少我认为是这样的!?
IIS没有安装任何证书。

我已经启用了extension=php_curl.dll,并在我的php.ini文件中定义了extension_dir = 'C:\64bit\php-7.0.6-Win32-VC14-x64\ext'。我按照这些步骤在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代理配置文件中没有定义RequestHeader例如在第10步建议的那样

RequestHeader set "X-RP-UNIQUE-ID"     "%{UNIQUE_ID}e"
RequestHeader set "X-RP-REMOTE-USER"     "%{REMOTE_USER}e"
RequestHeader set "X-RP-SSL-PROTOCOL"     "%{SSL_PROTOCOL}s"
RequestHeader set "X-RP-SSL-CIPHER"     "%{SSL_CIPHER}s"

这是修复错误所缺少的内容吗?


2
您可以使用https://www.ssllabs.com/ssltest/测试您的设置。 - WizKid
@WizKid 谢谢你提供的链接。我之前得到了一个 F 的成绩 - 真是太震惊了!我不知道出了什么问题。我将 Apache 从 2.4.20 更新到了 2.4.36,这让我的成绩提高到了 B。之后我注释掉了 SSLCertificateChainFile,这又让我的成绩提高到了 A。(我不确定 Facebook 错误是否由中间证书问题触发。) - MeSo2
3个回答

7

"无法获取本地颁发者证书"几乎总是在服务器在TLS握手过程中没有提供中间证书时出现的错误消息,正如WizKid所建议的那样,对服务器运行ssllabs测试确实会告诉您是否存在这种情况。


4
我也认为这是最有可能的问题。我曾经使用过以下工具来检查它,发现它非常简单/快速(比您建议的Qualys检查要快得多): https://whatsmychaincert.com (https://dev59.com/xF0a5IYBdhLWcg3w48Pn#49050648) - Tobias K.

0

可能当时不是这种情况,但我会加入这些信息以防其他人遇到同样的问题。

如果您正在使用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,则需要检查您是否已正确设置。

0
如果您正在使用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);


1
你的解决方案实际上并没有帮助我,但是它指引了我正确的方向来解决这个问题。结果发现对于 cert 字段,我必须导入 fullchain.pem 文件而不是 cert.pem 文件(奇怪的 LetsEncrypt 命名规则)。 - Epic Speedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接