Azure网站使用curl调用时使用错误的SSL证书(错误51)

时间:2014-05-29 11:31:14

标签: php azure curl ssl https

我在Azure网站上有一个项目,使用我的自定义.com域来托管一个只能使用HTTPS访问的API。 A-Records创建于.com域,该域正常运行。购买,上传SSL证书并在管理面板中正确设置SSL绑定。

当我使用IE / Chrome / FF访问API的方法时,会显示正确的证书(为我的.com域名发布)。当我使用curl使用以下PHP代码访问它时,我收到一条错误消息,好像服务器使用默认的* azurewebsites.com证书响应,该证书因向.com域的请求而失败。

$ch = curl_init('https://mydomain.com/api/v1/method');
$cabundle = dirname(__FILE__).'/ca-bundle.crt';

curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $jsonRequest);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt( $ch, CURLOPT_CAINFO, $cabundle);

$content = curl_exec($ch);
$curlInfo = curl_getinfo($ch);

(正如您所看到的,我已经使用验证证书所需的CA文件,如果我运行file_exists传递$cabundle变量作为参数,则返回true)< / p>

我得到的错误:

curl error 51: SSL: certificate subject name '*.azurewebsites.net' does not match target host name 'mydomain.com' content

正如已经说过的,如果我使用浏览器访问相同的URL,我的.com域的正确证书就是查看证书详细信息屏幕中显示的证书。

我应该怎么做curl请求/验证正确的证书,或者Azure响应所请求域的正确证书?

PS:将CURLOPT_SSL_VERIFYPEER设置为false,或将CURLOPT_SSL_VERIFYHOST设置为01不是选项,安全性对于此项目和MITM至关重要攻击可能非常有害。

1 个答案:

答案 0 :(得分:3)

可能在同一IP后面有几个证书,您需要使用SNI(服务器名称指示,例如服务器名称在SSL握手中发送)。并非所有卷曲版本都支持SNI,请查看Use cURL with SNI (Server Name Indication)