卷曲:SSL证书问题,请验证CA证书是否正常
2006年4月7日
使用Curl打开安全网址时,可能会出现以下错误:
SSL证书问题,请验证CA证书是否正常
我将解释错误的原因以及您应采取的措施。
消除错误的最简单方法是在脚本中添加以下两行。该解决方案带来了安全风险。
//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
让我们看看这两个参数的作用。引用手册。
CURLOPT_SSL_VERIFYHOST:1,用于检查SSL对等证书中是否存在公用名。2检查公用名是否存在,并验证其是否与提供的主机名匹配。
CURLOPT_SSL_VERIFYPEER:FALSE阻止CURL验证对等方的证书。可以使用CURLOPT_CAINFO选项指定要验证的备用证书,或者可以使用CURLOPT_CAPATH选项指定证书目录。如果禁用了CURLOPT_SSL_VERIFYPEER(默认值为2),则CURLOPT_SSL_VERIFYHOST也可能需要为TRUE或FALSE。将CURLOPT_SSL_VERIFYHOST设置为2(这是默认值)将确保向您提供的证书具有与您用于访问远程资源的URN匹配的“公用名”。这是健康检查,但不能保证您的程序未被欺骗。
输入“中间人”
您的程序可能会误导您与另一台服务器通信。这可以通过多种机制来实现,例如dns或arp中毒(这是另一天的故事)。入侵者还可以使用您的程序期望的“通用名称”自签名证书。通信仍将被加密,但是您会将您的秘密透露给冒名顶替者。这种攻击称为“中间人”
击败“中间人”
好吧,我们需要验证提交给我们的证书是否真实。为此,我们将其与我们合理*信任的证书进行比较。
如果远程资源受到主要CA之一(如Verisign,GeoTrust等)颁发的证书的保护,则可以与可从http://curl.haxx.se/docs/caextract获得的Mozilla的CA证书包进行比较。
.html
将文件保存cacert.pem
在服务器中的某个位置,然后在脚本中设置以下选项。
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");