file_get_contents(): SSL opération a échoué avec le code 1. Et plus
Je suis en train d'essayer d'accéder à ce service REST à partir d'une page PHP que j'ai créé sur notre serveur. J'ai réduit le problème à ces deux lignes. Donc ma page PHP qui ressemble à ceci:
<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");
echo $response; ?>
La page meurt sur la ligne 2 avec les erreurs suivantes:
- Warning: file_get_contents(): SSL opération a échoué avec le code 1.
OpenSSL messages d'Erreur: erreur:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificat de vérifier échoué dans
...php on line 2
- Warning: file_get_contents(): impossible d'activer les crypto en php sur ...
ligne 2- Avertissement:
file_get_contents(https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
):
failed to open stream: échec de l'opération en ...php sur la ligne 2
Nous utilisons un serveur Gentoo. Nous avons récemment mis à niveau vers la version de PHP 5.6. C'est après la mise à niveau lorsque ce problème est apparu.
J'ai trouvé quand j'ai remplacer le service REST avec une adresse comme https://www.google.com
; ma page fonctionne très bien.
Dans une précédente tentative, j'ai mis “verify_peer”=>false
, et a passé que comme un argument de file_get_contents, comme décrit ici: file_get_contents ignorant verify_peer=>false? Mais comme l'auteur a noté; il ne fait aucune différence.
J'ai demandé à un de nos administrateurs de serveur si ces lignes dans notre php.ini fichier existe:
- extension=php_openssl.dll
- allow_url_fopen = On
Il m'a dit que puisque nous sommes sur Gentoo, openssl est compilé, lorsque nous construisons; et il n'est pas défini dans le php.fichier ini.
J'ai aussi confirmé que allow_url_fopen
est de travail. En raison de la nature spécialisée de ce problème; je ne suis pas à trouver beaucoup d'informations pour obtenir de l'aide. N'avez-vous venir à travers quelque chose comme ça? Merci.
- Si vous utilisez Kaspersky, vérifiez ceci: stackoverflow.com/a/54791481/3549317
Vous devez vous connecter pour publier un commentaire.
C'était une énorme lien utile pour trouver:
http://php.net/manual/en/migration56.openssl.php
Un document officiel qui décrit les changements apportés à l'open ssl en PHP 5.6
À partir d'ici que j'ai appris d'un paramètre plus je doit avoir la valeur false: "verify_peer_name"=>false
Donc mon code ressemble à ceci:
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Vous ne devriez pas simplement désactiver la vérification. Plutôt, vous devez télécharger un certificat de bundle, peut-être le curl bundle va faire?
Ensuite, vous avez juste besoin de le mettre sur votre serveur web, en donnant à l'utilisateur qui exécute php autorisation de lire le fichier. Ce code devrait fonctionner pour vous:
Espérons-le, le certificat racine du site que vous tentez d'accéder est dans la boucle bundle. Si ce n'est pas le cas, cela ne fonctionne toujours pas, jusqu'à ce que vous obtenir le certificat racine du site et le mettre dans votre fichier de certificat.
stream_context_set_default
qui peut être utilisé de sorte que vous n'avez pas à passer en cochant à chaque fois"capture_peer_cert_chain" => true
à$arrContextOptions
. Ensuite, l'appel à file_get_contents comprendra également le certificat de la chaîne de l'hôte que vous essayez de vous connecter à encodé en base64). Je crois que le dernier certificat répertorié dans la sortie est le certificat racine et que le certificat doit être dans le cert fichier que vous êtes en utilisant, dans l'ordre pour que cela fonctionne. Notez qu'il peut y avoir un autre problème avec l'hôte ou côté client qui est à l'origine de la panne (c'est à dire expiré hôte cert, client le temps est incorrect, etc)pem
fichier?file_get_contents
SSL contexte. php.net/manual/en/context.ssl.phpJ'ai corrigé cela, assurez-vous que OpenSSL est installé sur ma machine, puis en ajoutant ceci à mon php.ini:
cert.pem
fichier et mettre lephp.ini
comme ça, et il a travaillé:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Vous pouvez contourner ce problème en écrivant une fonction personnalisée qui utilise curl, comme dans:
Alors utilisez simplement
file_get_contents_curl
au lieu defile_get_contents
chaque fois que vous êtes à l'appel d'une url commençant par https.Si votre version de PHP est de 5, essayez d'installer cURL en tapant la commande suivante dans le terminal:
cURL
.sudo port install php70-curl
En gros, vous devez définir la variable d'environnement SSL_CERT_FILE pour le chemin d'accès du fichier PEM du certificat ssl téléchargé à partir du lien suivant : http://curl.haxx.se/ca/cacert.pem.
Il m'a fallu beaucoup de temps pour comprendre cela.
suivant les étapes ci-dessous va résoudre ce problème,
curl.cainfo
et collez le chemin absolu où vous avez télécharger le Certificat.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
espère que ça aide !!
Voulais juste ajouter à cela depuis que j'ai rencontré le même problème et rien de ce que j'ai pu trouver n'importe où serait de travailler (e.g télécharger le cacert.fichier pem, réglage cafile en php.ini etc.)
Si vous utilisez NGINX et votre certificat SSL est livré avec un "certificat intermédiaire", vous avez besoin de combiner l'intermédiaire cert fichier avec votre main "mondomaine.com.crt" fichier et cela devrait fonctionner. Apache a un réglage spécifique pour les certificats intermédiaires, mais NGINX ne le fait pas, il doit être dans le même fichier que votre cert.
De travail pour moi, je suis à l'aide de PHP 5.6. openssl extension doit être activé et tout en appelant l'api google map verify_peer faire des faux
Code ci-dessous est de travailler pour moi.
Raison de cette erreur est que PHP ne dispose pas d'une liste d'autorités de certification de confiance.
PHP 5.6 et plus tard d'essayer de charger les CAs approuvés par le système automatique. Problèmes avec qui peut être fixe. Voir http://php.net/manual/en/migration56.openssl.php pour plus d'informations.
PHP 5.5 et versions antérieures sont vraiment difficile à configurer correctement depuis, manuellement, vous devez spécifier le CA bundle dans chaque contexte de demande, une chose que vous ne voulez pas de les arroser autour de votre code.
J'ai donc décidé pour mon code que pour les versions de PHP < 5.6, la vérification SSL obtient tout simplement désactivé:
Eu le même ssl problème sur mon ordinateur du développeur (php 7, xampp sous windows) avec un certificat auto-signé en essayant de fopen un "https://localhost/..."-fichier. Évidemment, la racine-certificat-assemblée (cacert.pem) n'a pas fonctionné.
Je viens de copier manuellement le code du serveur apache.crt-Fichier téléchargé cacert.pem et ne openssl.cafile=chemin/vers/cacert.pem entrée en php.ini
Eu la même erreur avec PHP 7 sur XAMPP et OSX.
Mentionné ci-dessus la réponse dans https://stackoverflow.com/ est bon, mais il n'a pas de résoudre complètement le problème pour moi. J'ai dû fournir le certificat de la chaîne de faire file_get_contents() fonctionne de nouveau. C'est la façon dont je l'ai fait:
Racine /certificat intermédiaire
Tout d'abord, je devais savoir ce qui est la racine et le certificat intermédiaire.
Le plus pratique, c'est peut-être en ligne cert-outil comme le ssl-shopper
J'y ai trouvé trois certificats, un serveur de certificat et de deux à la chaîne de certificats (l'un est la racine, l'autre apparemment, les intermédiaires).
Tous j'ai besoin est juste une recherche sur internet pour tous les deux. Dans mon cas, c'est la racine:
DV SSL thawte SHA256 CA
Et il conduit son url d' thawte.com. Donc j'ai juste mis cette cert dans un fichier texte et fait de même pour le niveau intermédiaire. Fait.
Obtenir les certificats de l'ordinateur hôte
Prochaine chose que j'ai eu à faire est de télécharger mon serveur cert. Sur Linux ou OS X, il peut être fait avec openssl:
Maintenant les mettre tous ensemble
Maintenant d'intégrer tout cela dans un seul fichier. (C'est peut-être bon de tout mettre dans un seul dossier, je viens de les fusionner en un seul fichier). Vous pouvez le faire comme ceci:
dire à PHP où trouver de la chaîne
Il y a cette fonction très pratique openssl_get_cert_locations() qui vais vous dire, là où PHP est à la recherche d'cert fichiers. Et il y a ce paramètre, qui dira file_get_contents() où regarder pour cert fichiers. Peut-être les deux méthodes de travail. J'ai préféré le paramètre de chemin. (Par rapport à la solution mentionnée ci-dessus).
C'est donc maintenant mon Code PHP
C'est tout. file_get_contents() fonctionne à nouveau. Sans CURL et espérons-le, sans failles de sécurité.
chain.pem
? Est-cechain.crt
?Après la chute de la victime de ce problème sur centOS après la mise à jour de php php5.6 j'ai trouvé une solution qui a fonctionné pour moi.
Obtenir le bon répertoire pour votre certs pour être placé par défaut avec cette
Puis de les utiliser pour obtenir le cert et le mettre dans l'emplacement par défaut trouvé dans le code ci-dessus
Concernant des erreurs similaires à
[11-Mai-2017 19:19:13 America/Chicago] PHP Warning: file_get_contents(): SSL opération a échoué avec le code 1. OpenSSL messages d'Erreur:
erreur:14090086:SSL routines:ssl3_get_server_certificate:certificat de vérifier échoué
Avez-vous vérifié les autorisations du cert et annuaires référencés par openssl?
Vous pouvez le faire
Pour obtenir quelque chose de similaire à ce
Cette question frustré de moi pendant un moment, jusqu'à ce que j'ai compris que mon "certs" dossier avait 700 autorisations, quand il aurait dû 755 autorisations. Rappelez-vous, ce n'est pas le dossier pour les clés, mais les certificats. Je vous recommande la lecture de ce ce lien sur ssl autorisations.
Une fois que je ne
Le problème a été résolu, au moins pour moi, de toute façon.
J'ai eu le même problème pour une autre page sécurisée lors de l'utilisation de
wget
oufile_get_contents
. Beaucoup de la recherche (y compris certaines des réponses à cette question) ont abouti à une solution simple - installation de Curl et PHP-Curl - Si j'ai bien compris, le Roulage est l'autorité de certification Racine de Comodo qui a résolu le problèmeInstaller Curl et PHP-Curl addon, puis redémarrez Apache
Tous maintenant de travail.
Une autre chose à essayer est de ré-installer
ca-certificates
comme détaillé ici.Et une autre chose à essayer est d'autoriser explicitement l'un certificat du site en question comme décrit ici (surtout si un site est votre propre serveur et vous avez déjà la .pem à portée de main).
J'ai été en cours d'exécution dans cette SORTE d'erreur après la mise à jour de PHP 5.6 sur CentOS 6 tentative d'accès au serveur lui-même qui a un cheapsslsecurity certificat qui peut-être il a besoin d'être mis à jour, mais au lieu de cela, j'ai installé un letsencrypt certificat et avec ces deux étapes ci-dessus, il a fait le tour. Je ne sais pas pourquoi la deuxième étape a été nécessaire.
Commandes Utiles
Afficher une version d'openssl:
Vue PHP cli ssl paramètres actuels: