17

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

4

6 回答 6

37

大概您将在服务器 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);
于 2012-12-03T19:26:03.300 回答
3

CURLOPT_SSL_VERIFYPEER不应接受建议禁用的答案。问题是“为什么它不能与 cURL 一起使用”,并且正确指出它是危险的。禁用证书检查为中间人攻击打开了大门,这接近于仅使用纯文本 http。

该错误可能是由于没有最新的 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复制的答案。

于 2018-12-20T20:52:53.733 回答
2

通过将网站的证书添加到受信任的 CA 列表中,您可以使用自签名证书发布到网站。我已经在 Debian 中对此进行了测试,也许它也适用于 Ubuntu、CentOS 等。

首先获取自签名网站的证书(ssws = 自签名网站):

openssl s_client -connect <ssws-hostname>:<ssws-port>

Ctrl-C 退出 openssl 命令并检查输出。找到在这些标记之间编码的服务器的自签名证书:

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----

复制证书、标记和所有内容,并将其内容粘贴到一个新文件中,并给文件一个“.crt”扩展名,例如“my-favorite-self-signed-website.crt”。然后...

sudo chmod 644 my-favorite-self-signed-website.crt
sudo chown root:root my-favorite-self-signed-website.crt
sudo mv my-favorite-self-signed-website.crt /usr/local/share/ca-certificates/.
sudo /usr/sbin/update-ca-certificates

最后一个命令应指示“添加 1”,表明您的自签名网站现在是此计算机的真正可信实体。PHP 会自动从系统中获取它并符合要求。

除非您正在进行一些非常初步的开发/测试/集成,否则您永远不应该在 SSL/TLS 中禁用对等验证,正如其他答案中所提供的那样。如果没有对等验证,你还不如只做普通的 HTTP。

于 2021-07-13T03:15:09.823 回答
1

这是可行的。在 PHP 中,如果您使用 cURL 执行 POST,您只需将选项设置为 false CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOST这样它就不会因为证书是自签名的而失败。

于 2012-12-03T19:25:53.567 回答
1

如果您要求浏览器发布数据,那么用户将收到有关证书不受信任的正常警告。

如果您使用 cURL 从 PHP 代码中执行 POST,则需要禁用 cURL 的 SSL 检查。根据一个相关问题

您需要设置CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTto FALSE。这应该禁用两个主要检查。它们可能都不是必需的,但这至少应该让你继续前进。

于 2012-12-03T19:27:09.803 回答
0

就我而言,只有我的开发服务器是自签名的,所以我将 verifypeer 选项设置为 false 并且它可以工作。但是我的生产服务器是完全签名的,所以我没有设置 verifypeer 选项。无论哪种情况,都不需要 verifyhost 选项。

于 2018-10-20T11:14:29.223 回答