【问题标题】:curl https ssl certificate problem error #35curl https ssl证书问题错误#35
【发布时间】:2020-10-10 21:01:37
【问题描述】:

我有一台带有 https 地址和用户身份验证的机器,并通过和 Invalid ssl 。所以我可以用 linux 命令行连接它:

curl -k --anyauth -u username:password -d '{"flag":"all"}' -H "Content-Type:application/json" https://example.com

但我无法将它与这个 php 连接起来:

$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://example.com');
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY ) ;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type:application/json;"));
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_VERBOSE, 0);
$content = curl_exec($curl);

当我尝试将其与 php 连接时,出现此错误:

Curl failed with error #35: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

【问题讨论】:

  • 这可以是任何东西:没有通用的 TLS 协议、没有共享密码、缺少客户端证书...。它与服务器证书无关,因此禁用证书验证将无济于事。由于它适用于命令行 curl 但不适用于 PHP curl 可能是由于后端和/或版本不同造成的。请提供curl --versioncurl_version的详细信息。
  • @SteffenUllrich 感谢您的评论。我在命令行中检查 curl 版本,即:curl 7.29.0,我在 phpinfo() 中检查 curl 版本,即 7.72.0。
  • 所以现在你至少可以解释为什么 curl 命令行和 PHP 的行为不同了——因为它们是不同的版本。鉴于旧版本有效而​​新版本无效,我认为问题出在服务器的安全设置中:旧版本的 curl 可能接受比新版本更弱的协议和/或密码。不过,这只是猜测。为了更有帮助,需要 curl(命令行和 PHP)提供的详细版本信息,而不仅仅是版本号。人们还需要知道导致问题的目标域。
  • @SteffenUllrich 所以我认为 curl 必须将 php 降级到版本 7.29 。目标域可能需要一些更改吗?我可以在 php 中使用 curl 访问其他域。为了测试,我使用无效的 ssl 运行另一个域,我可以在 php 中使用 curl 访问它。
  • 请参阅我的评论,了解我需要哪些信息以提供有关问题原因的更多详细信息。只有当我知道导致问题的原因时,我才能提出修复建议或解决问题。

标签: php ssl curl


【解决方案1】:

可能的错误来源是客户端尝试使用服务器不支持的 SSL3。

您可以尝试使用 curl_setopt ($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_0); 强制 TLS1.0,看看是否有帮助。

【讨论】:

  • 不太可能。 OpenSSL 错误消息中的sslv3 通常并不意味着实际使用了 SSL 3.0,而是使用了同样实现 SSL 3.0 的代码库。
猜你喜欢
  • 2020-09-18
  • 2022-01-26
  • 2021-06-02
  • 2014-02-06
  • 2021-04-29
  • 1970-01-01
  • 2020-09-14
  • 2016-08-15
  • 2015-04-29
相关资源
最近更新 更多