【发布时间】: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 --version和curl_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 访问它。
-
请参阅我的评论,了解我需要哪些信息以提供有关问题原因的更多详细信息。只有当我知道导致问题的原因时,我才能提出修复建议或解决问题。