web-dev-qa-db-fra.com

Erreur: erreur: 14077410: routines SSL: SSL23_GET_SERVER_HELLO: échec de la négociation de l'alerte 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);

ce code fonctionne sur localhost mais quand je teste sur mon serveur live il me donne cette erreur Erreur: erreur: 14077410: routines SSL: SSL23_GET_SERVER_HELLO: échec de la poignée de main d'alerte sslv3 puis j'ai essayé 

<?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 ceci fonctionnera à nouveau sur localhost et sur live, il me le donne 

error bool(false)
string(67) "Unknown SSL protocol error in connection to tlstest.Paypal.com:443 "
DEBUG INFORMATION:
###########CURL VERSION

mon serveur a ces certificats

Clé de serveur et certificat n ° 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

exigences vérifiées à

3
Raza Saleem

Votre serveur peut prendre en charge TLS 1.2, mais vous devez vous assurer que les requêtes HTTP l’utilisent réellement. En fonction du résultat obtenu, vous n'utilisez apparemment pas TLS 1.2 avec les demandes.

Essayez d'ajouter ceci à vos options cURL:

curl_setopt($ch, CURLOPT_SSLVERSION, 6);

Cela forcera TLS 1.2.

Vous pouvez également mettre à jour la pile de logiciels de votre serveur et cela se fera automatiquement. Voir cet article pour plus de détails, principalement cette partie:

Si vous souhaitez utiliser TLS 1.2, vous devez au minimum passer à OpenSSL 1.0.1, puis vous pourrez définir CURLOPT_SSLVERSION sur 6 (TLS 1.2).

Si vous souhaitez que TLS 1.2 soit utilisé automatiquement lors des requêtes SSL, vous devez également mettre à niveau vers PHP 5.5.19+ (c'est la solution idéale, mais de nombreux projets sont encore sur des versions plus anciennes PHP). .

1
Drew Angell

TL; TR: votre logiciel est trop ancien pour prendre en charge ces serveurs.

Les deux serveurs prennent en charge TLS 1.2 uniquement, comme le montre la vérification avec SSLLabs . Votre version OpenSSL est 1.0.0s et ne supporte pas encore TLS 1.2. Le support n'est disponible que depuis la version 1.0.1. 

mon serveur a ces certificats ...

La configuration de votre serveur Web (certificats, versions TLS, etc.) n’est pas pertinente car, dans ce cas, vous êtes le client qui se connecte à un autre serveur.

1
Steffen Ullrich

Nous avions le même problème avec l’API stamps.com et dans notre cas au moment de cette publication, la solution consistait à définir le CURLOPT_SSLVERSION sur 5.

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