带有自签名证书的POST请求

Aar*_*ron 12 php security ssl post ssl-certificate

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

Mar*_*c B 24

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

curlopt_ssl_verifypeer  (checking the CA auth chain)
curlopt_ssl_verifyhost  (hostname/certname match checks)
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法配置PHP(或一般客户端)只接受*特定的*自签名证书?我想,这显然比不完全验证证书更安全. (6认同)
  • 注意:这个答案非常危险。忽略证书检查是一个非常糟糕的主意,它为中间人攻击打开了大门!忽略证书检查接近于使用普通的 http。不要使用这个答案,而是阅读那个答案:/sf/answers/1650985031/ (2认同)
  • @Dominik K,但你的回复并没有解决OP的原始问题。他如何使用自签名证书。您的解决方案仅支持受信任的第三方证书颁发机构,因此在 OP 的情况下不起作用。 (2认同)

Dom*_*k K 5

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

\n\n

该错误可能是由于没有最新的 CA 根证书包引起的。这通常是一个带有一堆加密签名的文本文件,curl 使用这些签名来验证 host\xe2\x80\x99s SSL 证书。

\n\n

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

\n\n

然后在php.ini中设置:

\n\n
curl.cainfo = <absolute_path_to> cacert.pem\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您在运行时设置它,请使用:

\n\n
curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");\n
Run Code Online (Sandbox Code Playgroud)\n\n

出于安全原因,从/sf/answers/1650985031/复制了答案。

\n

  • 不回答OP的问题,即如何让它与自签名证书一起使用。请重新阅读OP的问题,然后发布适用于他的特定用例的解决方案。 (3认同)
  • @ZackA我正在谈论自签名证书仅供您参考。即使使用自签名证书,禁用证书检查也是可怕的错误,因为这为 MITM 攻击打开了巨大的攻击向量。即使使用自签名证书,也不要将参数 CURLOPT_SSL_VERIFYPEER 设置为 false。如果将此参数设置为 false,攻击者可能会执行 MITM 攻击。 (2认同)

cha*_*erb 5

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

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

openssl s_client -connect <ssws-hostname>:<ssws-port>
Run Code Online (Sandbox Code Playgroud)

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

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

-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

复制证书、标记等所有内容,并将其内容粘贴到新文件中,并为该文件指定“.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
Run Code Online (Sandbox Code Playgroud)

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

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