Comment forcer un certain TLS version de PHP contexte de flux pour le transport ssl://?
Comment puis-je la force TLSv1.0 dans un PHP contexte de flux lorsque vous essayez d'accéder à un https
URL?
Je suis à la recherche de quelque chose le long des lignes de ce:
$context = stream_context_create(
array(
'ssl' => array(
'protocol_version' => 'tls1',
),
));
file_get_contents('https://example.com/test', false, $context);
Arrière-plan
En fait, je suis face à un problème dans Ubuntu 12.04 lorsque l'on travaille avec PHP SoapClient
. Malheureusement, le serveur, je suis en train d'essayer de se connecter à n'soutien SSLv3.0/TLSv1.0 et échoue sur le défaut TLSv1.1 la négociation. C'est pourquoi j'aimerais définir explicitement le protocole de la ssl://
de transport de TLSv1.0.
OriginalL'auteur Chriki | 2013-05-14
Vous devez vous connecter pour publier un commentaire.
PHP 5.6+ Utilisateurs
C'est une nouvelle fonctionnalité comme indiqué sur la PHP 5.6 OpenSSL Changements de page.
Au moment de l'écriture, PHP5.6 est en Beta1 et donc ce n'est pas trop utile. Les gens de l'avenir de la chance vous!L'avenir est à nous. PHP 5.6 est une chose et de son utilisation doit être encouragée. Sachez qu'il dénonçait certains assez largement utilisé des choses comme mysql_* fonctions de soins doivent être prises lors de la mise à niveau.
Tout le monde
@toubsen est correct dans sa réponse - ce n'est pas possible directement. Pour développer ses solutions de contournement proposées... lorsque l'on travaille autour d'un problème où un fournisseur de serveur API n'était pas correctement la négociation TLSv1.2 vers le bas à son pris en charge TLSv1.0, l'envoi d'un petit sous-ensemble d'algorithmes semble autoriser la négociation pour compléter correctement. Contexte de flux de code est:
SAVON Utilisateurs
PHP SOAP client de ne pas utiliser curl, ni semble-t-il à utiliser le contexte par défaut définie avec
stream_context_set_default
. En tant que tel, la création doit être transmis à la SOAPClient constructeur dans le 2e paramètre en tant que tel:Pourquoi ces Algorithmes?
L'exécution de la commande
openssl ciphers
sur le serveur vous donne une liste des algorithmes de chiffrement dans le format ci-dessus. L'exécution deopenssl ciphers -v
vous indique ceux qui sont TLSv1.2 spécifiques. La liste ci-dessus a été compilée à partir de toutes les non-TLSv1.2 les algorithmes rapporté par OpenSSL.openssl ciphers -v | grep -v 'TLSv1.2' | cut -d ' ' -f 1 | tr "\n" ':'
crypto_method
SSL cadre de l'option de PHP 5.6 si il y aurait eu une autre solution dans les précédentes versions de PHP. Donc, nous allons probablement avoir à vivre avec les solutions de contournement jusqu'à ce que PHP 5.6 peuvent être utilisés dans la production. Merci!Cela fonctionne pour moi.
À l'aide de
'ciphers'
en PHP 5.4 semble restreindre les algorithmes de chiffrement, de sorte que la cueillette seulement les algorithmes définis pour TLSv1.2 devrait travailler en 5.4.Cette solution a fonctionné en PHP 7.0 et openssl 1.0.2 k pour un serveur qui ne serait pas négocier TLS1.2 et ne serait pas renégocier le bas pour TLS1.0. Passé trop de temps de FAÇON à obtenir ce travail.
OriginalL'auteur phil-lavin
Au cas où quelqu'un veut savoir comment "désactiver" TLSv1.0 lors d'une requête SOAP...
La clé ici est que le contexte de flux les algorithmes ligne. Ce dit d'utiliser les algorithmes de chiffrement par défaut, mais exclure TLSv1.0 code (la 1.0 paquet a également TLSv1.1 les algorithmes). L' : est la clef de chiffrement paquet séparateur (ce qui se passe entre les paquets) et le ! ici est-à-dire d'exclure de cette offre (c'est dur d'exclure donc, si elle se montre plus loin dans la liste, il sera toujours exclus). Doux exclure est - personnage et les ajouter à la fin de la liste est le caractère+. Ajouter dans l'ordre, il suffit de l'ajouter, sans rien en face de lui.
De chiffre d'informations ici: https://www.openssl.org/docs/manmaster/man1/ciphers.html#CIPHER-LIST-FORMAT
Edit:
Pour quelque raison que ce soit, y compris la
partie de ces options était vraiment me causer des maux de tête et de ne pas se connecter dans certains contextes. Après des tonnes de dépannage et de jouer avec les options que j'ai finalement réalisé que la suppression de ce paramètre et de le laisser autoset cela semble avoir résolu le problème.
heureux d'entendre ça! Il m'a fallu une éternité pour comprendre ce que le diable se passait. Vous avez raison au sujet de la constante. J'ai eu le même problème et n'était pas en mesure de l'utiliser, de sorte que j'ai dû commencer à chercher des alternatives. Puis je suis tombé sur le contexte de flux. Cela a fonctionné un peu, et puis j'ai réalisé que j'avais besoin de prendre l'ancienne constante pour le ssl méthode, car il était de forcer vers le bas à TLS 1.1 et arrosant les choses.
votre suggèrent était utile, mais dans mon cas avec PHP 5.5 juste un commentaire le ssl_method résoudre le problème.
OriginalL'auteur Robert McMahan
Informations de la Base de
Le domaine
protocol_version
n'est valable que pour le contexte HTTP (HTTP 1.0 vs 1.1), mais n'affecte pas le SSL contexte.La suite de la page de manuel de listes de tous les flux d'options de contexte pour PHP:
Cadre d'options et de paramètres
Pour tous les certificats SSL fonction gestionnaires de flux, seules les options suivantes sont disponibles:
SSL options de contexte
Solutions possibles /solutions de contournement
Premier conseil: le serveur d'administration pour fixer ses serveur au lieu de travailler autour de cette dans votre client 😉
Peut-être que vous pouvez l'obtenir wo travail avec le
algorithmes
pour SSL des ruisseaux, à une seule exacte TLSv1.0 de la suite de chiffrement (qui est unique à TLSv1.0) dans la liste, que votre serveur cible prend en charge.De commutation de la implementaion à utiliser cURL plus probaly aide pas également ici que, selon les une entrée dans leur liste de diffusion, il n'y a pas d'option pour forcer un certain TLS version - le client sera de la décote lorsque nécessaire, automatiquement.
tl;dr
Actuellement, je ne connais aucun moyen explicitement force TLSv1.0 pour les connexions SSL à partir de PHP.
ciphers
option: je crois que j'avais essayé qu'alors, sans succès; mais je n'ai pas correctement rappeler. Maintenant, je ne peux pas le tester ...plusOriginalL'auteur toubsen
Je peux confirmer que ci-dessus accepté de répondre ne fonctionne pas pour Ubuntu 12.04 et PHP 5.4.33 combinaison. Aussi découvert que j'ai pour spécifier manuellement le certificat lors de la tentative d'openssl et de curl pour accéder aux points de terminaison https. J'ai fini à l'aide de RHEL 7 et PHP 5.5 pour parvenir à une solution solide que j'ai été le développement de l'intégration d'une application d'entreprise. Rien contre Ubuntu, mais dans mon cas précis, il ne fonctionne pas.
OriginalL'auteur Arun Vasudevan Nair