使用自签名证书的 POST 请求

2022-08-30 21:43:04

我将使用PHP将一些数据从站点A发布到站点B。站点 A 具有商业 SSL 证书。站点 B 将具有自签名证书。这可行吗?如果没有,PHP(或Apache)中是否有任何配置选项可以设置为绕过限制?


答案 1

想必你会在服务器A上使用curl?curl 中有几个选项可用于禁用证书验证,这将允许自签名证书通过。该链接仍将加密,但您将无法相信服务器 B 确实是服务器 B:

curlopt_ssl_verifypeer  (checking the CA auth chain)
curlopt_ssl_verifyhost  (hostname/certname match checks)

示例 PHP 代码:

$ch = curl_init("https://example.com/example/path"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);

答案 2

建议禁用的答案不应被接受。问题是“为什么它不适用于cURL”,正如正确指出的那样,它是危险的。禁用证书检查为中间人攻击打开了大门,这几乎等于只使用纯文本http。CURLOPT_SSL_VERIFYPEER

该错误可能是由于没有最新的 CA 根证书捆绑包引起的。这通常是一个文本文件,其中包含一堆加密签名,curl 使用这些签名来验证主机的 SSL 证书。

您需要确保PHP安装具有这些文件之一,并且它是最新的(否则在此处下载一个:http://curl.haxx.se/docs/caextract.html)。

然后在 php 中设置.ini:

curl.cainfo = <absolute_path_to> cacert.pem

如果要在运行时进行设置,请使用:

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");

出于安全原因,答案是从 https://stackoverflow.com/a/23585500/2650835 复制的。


推荐