【问题标题】:POST request with a self-signed certificate带有自签名证书的 POST 请求
【发布时间】:2012-11-21 07:51:30
【问题描述】:

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

【问题讨论】:

  • 如果可行,不如先试试看?
  • 因为应用程序不完整,站点 B 甚至还没有设置,也不在我的控制之下

标签: php security post ssl ssl-certificate


【解决方案1】:

大概您将在服务器 A 上使用 curl? curl 中有几个选项可以禁用证书验证,这将允许自签名证书通过。该链接仍将被加密,但您将无法相信服务器 B 真的 IS 服务器 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);

【讨论】:

  • 有没有办法将 PHP(或一般的客户端)配置为只接受 specific 自签名证书?我想这表面上会比根本不验证证书更安全。
  • 注意:这个答案非常危险。忽略证书检查是一个非常糟糕的主意,它为中间人攻击打开了大门!忽略证书检查接近于使用纯 http。不要使用这个答案,而是阅读那个答案:stackoverflow.com/a/23585500/2650835
  • @Dominik K 您的回复并未解决 OP 的原始问题。他如何使用自签名证书。您的解决方案仅支持受信任的第 3 方证书颁发机构,因此不适用于 OP。
  • @ZackA 我在谈论自签名证书只是为了您的信息。即使使用自签名证书也禁用证书检查是可怕的错误,因为这会为 MITM 攻击打开一个巨大的攻击向量。即使使用自签名证书,也永远不要将参数 CURLOPT_SSL_VERIFYPEER 设置为 false。如果您将此参数设置为 false,攻击者可能会执行 MITM 攻击。
  • CURLOPT_SSL_VERIFYHOST 不是bool,而是int,取值范围为0 到2。禁用主机检查的正确方法是将变量设置为零。
【解决方案2】:

不应接受建议禁用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复制答案。

【讨论】:

  • 不回答 OP 的问题,即如何使用自签名证书。请重新阅读 OP 的问题,然后发布适用于他特定用例的解决方案。
  • @ZackA 我在谈论自签名证书只是为了您的信息。即使使用自签名证书也禁用证书检查是可怕的错误,因为这会为 MITM 攻击打开一个巨大的攻击向量。即使使用自签名证书,也永远不要将参数 CURLOPT_SSL_VERIFYPEER 设置为 false。如果您将此参数设置为 false,攻击者可能会执行 MITM 攻击。
【解决方案3】:

您可以通过将网站的证书添加到您的受信任 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

last command 应表示“添加了 1”,表示您的自签名网站现在是此计算机的真正可信实体。 PHP 会自动从系统中挑选出来并排成一行。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 不,不要禁用验证。改为添加例外。
    • 只应在开发/测试/集成的最初步阶段禁用对等验证。这不应该在生产中使用。这几乎完全否定了 TLS/SSL 提供的安全保证。
    【解决方案5】:

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

    如果您使用 cURL 从 PHP 代码中执行 POST,则需要禁用 cURL 的 SSL 检查。根据related question

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

    【讨论】:

    • 为了完整起见,请勿禁用 HTTPS 验证。改为添加例外。
    • 关于如何添加异常的解释可能比此评论更彻底地服务于完整性目标。
    • 只应在开发/测试/集成的最初步阶段禁用对等验证。这不应该在生产中使用。这几乎完全否定了 TLS/SSL 提供的安全保证。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 2019-05-13
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多