错误:错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3握手失败警报

5
$ch = curl_init();
$clientId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/oauth2/token");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $clientId.":".$secret);
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);

这段代码在本地主机上可以工作,但是当我在我的实际服务器上测试时,它会给我一个错误:Error:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure 然后我尝试了这个。
<?php
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://tlstest.paypal.com/"); 
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
var_dump(curl_exec($ch));
if ($err = curl_error($ch)) {
var_dump($err);
echo "DEBUG INFORMATION:\n###########";
echo "CURL VERSION";
echo json_encode(curl_version(), JSON_PRETTY_PRINT);
}?>

这句话的意思是:“github.com/paypal/TLS-update/tree/master/php 这个在本地主机上可以正常运行,在线上环境上会出现问题。”
error bool(false)
string(67) "Unknown SSL protocol error in connection to tlstest.paypal.com:443 "
DEBUG INFORMATION:
###########CURL VERSION

我的服务器拥有这些证书:

服务器密钥和证书#1

Subject *.secure.xxxxxxxx.com


Fingerprint SHA1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx


Pin SHA256: S4/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


Common names    *.secure.xxxxxxxx.com   MISMATCH


Alternative names   *.secure.xxxxxxx.com



Key RSA 2048 bits (e 65537)


Weak key (Debian)   No


Issuer  Symantec Class 3 Secure Server CA - G4


AIA: xxxxxxx/ss.crt


Signature algorithm SHA256withRSA


Extended Validation No


Certificate Transparency    Yes (certificate)


OCSP Must Staple    No


Revocation information  CRL, OCSP


CRL: xxxxxx/ss.crl


OCSP: xxxxxxxxx


Revocation status   Good (not revoked)

Trusted No   NOT TRUSTED (Why?)

#2

Subject Symantec Class 3 Secure Server CA - G4


Fingerprint SHA1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


Pin SHA256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


Key RSA 2048 bits (e 65537)


Issuer  VeriSign Class 3 Public Primary Certification Authority - G5


Signature algorithm SHA256withRSA

#3

Subject VeriSign Class 3 Public Primary Certification Authority - G5


Fingerprint SHA1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


Pin SHA256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Key RSA 2048 bits (e 65537)


Issuer  VeriSign, Inc. / Class 3 Public Primary Certification Authority

Signature algorithm SHA1withRSA   WEAK

**Protocols**


TLS 1.2 Yes


TLS 1.1 Yes


TLS 1.0 Yes


SSL 3   No


SSL 2   No

enter image description here

已检查要求

可能是由于旧的curl/openssl版本引起的。请在您的问题中添加相关的版本信息。请参阅http://php.net/manual/en/function.curl-version.php。 - Steffen Ullrich
@SteffenUllrich curl 详情请见 http://i.stack.imgur.com/5tPfC.png,以下是 function.curl-version.php 的响应:CURL_VERSION_IPV6 不匹配 CURL_VERSION_KERBEROS4 不匹配 CURL_VERSION_SSL 匹配 CURL_VERSION_LIBZ 匹配 - Raza Saleem
如果你真的想得到帮助,就要让别人帮助你变得容易:例如使用适当的格式,并且不要将相关信息(如软件版本)隐藏在评论中的图像中。请记住:没有人有义务帮助你,所以只需使用剪切+粘贴将信息作为文本输入到您的原始问题中即可。 - Steffen Ullrich
3个回答

3
TL;TR: 您的软件版本过旧,不支持这些服务器。
两个服务器都只支持TLS 1.2,可以通过SSLLabs检查得知。您的OpenSSL版本为1.0.0s,尚不支持TLS 1.2。仅从1.0.1开始提供支持。

我的服务器有这些证书......

您的Web服务器设置(即证书、TLS版本等)与此无关,因为在这种情况下,您是客户端连接到其他服务器。

1
您的服务器可能支持TLS 1.2,但需要确保HTTP请求实际上正在使用它。根据您收到的结果,显然您并未在请求中使用TLS 1.2。
尝试将以下内容添加到您的cURL选项中:
curl_setopt($ch, CURLOPT_SSLVERSION, 6);

这将强制使用TLS 1.2。

或者,更新您的服务器软件堆栈,这将自动发生。请参见this post以获取更多详细信息,特别是以下部分:

如果您想使用TLS 1.2,则至少需要升级到OpenSSL 1.0.1,然后您将能够将CURLOPT_SSLVERSION设置为6(TLS 1.2)。

如果您希望在SSL请求期间自动使用TLS 1.2,则还需要升级到PHP 5.5.19+(这是理想的解决方案,但许多项目仍在使用较旧的PHP版本)。


你所贴出的错误明确指出请求是使用sslv3进行的,因此你对服务器的信息可能不正确。这是一个非常常见的问题。更多详情请参见此帖子 - Drew Angell
@AndrewAngell:OpenSSL在许多地方都会出现“sslv3 alert handshake failure”等错误,即使没有涉及SSL 3.0,因为它只是处理SSL 3.+(即SSL 3.0、TLS 1.0等)消息的代码中发生的。这非常令人烦恼,因为实际消息中通常根本没有涉及sslv3。 - Steffen Ullrich
我从未见过 PayPal 在不使用 SSLv3 时出现这个错误。这是一个非常特定的错误。 - Drew Angell
@AndrewAngell 在我的服务器上,我有SSL版本OpenSSL/1.0.0s,正如您所看到的http://i.stack.imgur.com/5tPfC.png。 - Raza Saleem
正如我的回答所述,您需要至少OpenSSL 1.0.1(于2012年发布)才能使用TLS 1.2。您需要更新您的服务器软件栈。 - Drew Angell
显示剩余2条评论

0

我们在使用stamps.com API时遇到了同样的问题,在这篇文章发布时,我们的解决方案是将CURLOPT_SSLVERSION设置为5

curl_setopt($ch, CURLOPT_SSLVERSION, 5);

不是5,它不能工作。5将使用TLS 1.1。您需要6,它适用于TLS 1.2。 - Drew Angell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接