$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);
此代码在localhost上工作,但是当我在我的实时服务器上测试时,它会给我这个错误错误:错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败然后我尝试了这个< / p>
<?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这将再次在localhost和现场工作它给我这个
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
答案 0 :(得分:2)
TL; TR:您的软件太旧,无法支持这些服务器。
两个服务器仅支持TLS 1.2,这可以在使用SSLLabs进行检查时看到。您的OpenSSL版本是1.0.0s,但尚不支持TLS 1.2。支持仅在1.0.1之后可用。
我的服务器有这些证书......
Web服务器的设置(即证书,TLS版本......)不相关,因为在这种情况下,您是连接到其他服务器的客户端。
答案 1 :(得分: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版本上)。
答案 2 :(得分:0)
stamps.com API也存在同样的问题,在我们撰写本文时,我们的解决方案是将CURLOPT_SSLVERSION
设置为5
。
curl_setopt($ch, CURLOPT_SSLVERSION, 5);