$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で機能しますが、ライブサーバーでテストしていると、次のエラーが表示されます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これは再び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
TL; TR:ソフトウェアが古すぎてこれらのサーバーをサポートできません。
SSLLabs で確認するとわかるように、どちらのサーバーもTLS 1.2のみをサポートしています。 OpenSSLのバージョンは1.0.0sで、TLS 1.2はまだサポートされていません。サポートは1.0.1以降でのみ利用できます。
私のサーバーにはこれらの証明書があります...
Webサーバーの設定(証明書、TLSバージョンなど)は関係ありません。この場合、他のサーバーに接続しているクライアントだからです。
サーバーがTLS 1.2をサポートしている可能性がありますが、HTTPリクエストが実際にそれを使用していることを確認する必要があります。得られた結果に基づいて、リクエストでTLS 1.2を使用していないようです。
これをcURLオプションに追加してみてください:
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
これにより、TLS 1.2が強制されます。
または、サーバーソフトウェアスタックを更新すると、これが自動的に行われます。詳細については この投稿 を参照してください。最も重要なのはこの部分です。
TLS 1.2を使用する場合は、少なくともOpenSSL 1.0.1にアップグレードする必要があります。その後、CURLOPT_SSLVERSIONを6(TLS 1.2)に設定できます。
SSLリクエスト中にTLS 1.2を自動的に使用したい場合は、PHP 5.5.19以降にアップグレードする必要もあります(これは理想的なソリューションですが、多くのプロジェクトはまだ古いPHPバージョンにあります) 。
Stamps.com APIでも同じ問題がありましたが、この記事の執筆時点ではCURLOPT_SSLVERSION
から5
。
curl_setopt($ch, CURLOPT_SSLVERSION, 5);