web-dev-qa-db-ja.com

エラー:エラー:14077410:SSLルーチン:SSL23_GET_SERVER_HELLO:sslv3アラートハンドシェイクエラー

$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

enter image description here

チェック済みの要件 at

3
Raza Saleem

TL; TR:ソフトウェアが古すぎてこれらのサーバーをサポートできません。

SSLLabs で確認するとわかるように、どちらのサーバーもTLS 1.2のみをサポートしています。 OpenSSLのバージョンは1.0.0sで、TLS 1.2はまだサポートされていません。サポートは1.0.1以降でのみ利用できます。

私のサーバーにはこれらの証明書があります...

Webサーバーの設定(証明書、TLSバージョンなど)は関係ありません。この場合、他のサーバーに接続しているクライアントだからです。

2
Steffen Ullrich

サーバーが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バージョンにあります) 。

1
Drew Angell

Stamps.com APIでも同じ問題がありましたが、この記事の執筆時点ではCURLOPT_SSLVERSIONから5

curl_setopt($ch, CURLOPT_SSLVERSION, 5);
0
Martin