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

Posted

技术标签:

【中文标题】错误:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败【英文标题】:Error:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure 【发布时间】:2016-12-12 03:48:06 【问题描述】:
$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);

这段代码在本地主机上工作,但是当我在我的实时服务器上进行测试时,它会给我这个错误错误:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败然后我尝试了这个

<?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

检查要求at

【问题讨论】:

这可能是由于旧的 curl/openssl 版本。请在您的问题中添加相关版本信息。见php.net/manual/en/function.curl-version.php。 @SteffenUllrich curl details i.stack.imgur.com/5tPfC.png 这是 function.curl-version.php 的响应 CURL_VERSION_IPV6 不匹配 CURL_VERSION_KERBEROS4 不匹配 CURL_VERSION_SSL 匹配 CURL_VERSION_LIBZ 匹配 如果您真的想获得帮助,让其他人更容易帮助您:即使用正确的格式并且不要在评论内的图像中隐藏相关信息(如软件版本)。请记住:没有人需要帮助您,因此只需使用剪切+粘贴将信息作为文本输入到您的原始问题中。 【参考方案1】:

TL;TR:您的软件太旧,无法支持这些服务器。

两台服务器仅支持 TLS 1.2,这在使用 SSLLabs 进行检查时可以看到。您的 OpenSSL 版本是 1.0.0s,尚不支持 TLS 1.2。仅从 1.0.1 开始提供支持。

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

您的网络服务器的设置(即证书、TLS 版本...)不相关,因为在这种情况下,您是连接到其他服务器的客户端。

【讨论】:

【参考方案2】:

您的服务器可能支持 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 发出的,因此您拥有的有关服务器的信息一定不正确。这是一个非常普遍的问题。有关详细信息,请参阅this post。 @AndrewAngell:即使不涉及 SSL 3.0,openssl 也会在很多地方吐出“sslv3 alert handshake failure”和类似错误,因为它只发生在处理 SSL 3.+ 的代码中(即 SSL 3.0 , TLS 1.0...) 消息。这很烦人,因为真正的消息中通常根本不涉及 sslv3。 在不使用 sslv3 时,我从未见过来自 PayPal 的此错误。这是一个非常具体的错误。 @AndrewAngell 在我的服务器上我有 SSL 版本 OpenSSL/1.0.0s,如您所见 i.stack.imgur.com/5tPfC.png 正如我在回答中所说,您至少需要 OpenSSL 1.0.1(2012 年发布)才能使 TLS 1.2 正常工作。您需要更新服务器软件堆栈。【参考方案3】:

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

curl_setopt($ch, CURLOPT_SSLVERSION, 5);

【讨论】:

No...5 不起作用。 5 将使用 TLS 1.1。您需要 6 个,用于 TLS 1.2。

以上是关于错误:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败的主要内容,如果未能解决你的问题,请参考以下文章

curl:(35)错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败

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

Cloudflare SSL第三方访问错误

Cloudflare SSL 第 3 方访问错误

WordPress 支付错误

如何解决错误 SSL23_GET_SERVER_HELLO:sslv3 警报握手失败