我在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
设置为0
或1
不是选项,安全性对于此项目和MITM至关重要攻击可能非常有害。
答案 0 :(得分:3)
可能在同一IP后面有几个证书,您需要使用SNI(服务器名称指示,例如服务器名称在SSL握手中发送)。并非所有卷曲版本都支持SNI,请查看Use cURL with SNI (Server Name Indication)。