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


Azure Website using the wrong SSL certificate when called using curl (Error 51)

我在Azure网站上有一个项目,托管一个API,应该只能使用HTTPS访问,使用我的自定义。com域名。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文件,如果我运行一个传递$cabundle变量作为参数的file_exists,它将返回true)

我得到的错误:

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攻击可能非常有害

可能在同一个IP后面有几个证书,你需要使用SNI(服务器名称指示,例如服务器名称在SSL握手中发送)。并非所有版本的curl都支持SNI,请勾选"使用SNI的curl(服务器名称指示)"。