Eu tenho tentado acessar este serviço REST em particular a partir de uma página PHP que criei em nosso servidor. Eu reduzi o problema até essas duas linhas. Então, minha página PHP fica assim:
<?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; ?>
A página morre na linha 2 com os seguintes erros:
- Aviso: file_get_contents (): A operação SSL falhou com o código 1. Mensagens de erro do OpenSSL: erro: 14090086: rotinas SSL: SSL3_GET_SERVER_CERTIFICATE: falha na verificação do certificado em ... php na linha 2
- Aviso: file_get_contents (): falha ao ativar criptografia em ... php na linha 2
- Aviso: 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
): falha ao abrir fluxo: operação falhou em ... php na linha 2
Estamos usando um servidor Gentoo. Recentemente, atualizamos para o PHP versão 5.6. Foi após a atualização quando esse problema apareceu.
Encontrei quando substituí o serviço REST por um endereço como https://www.google.com
; minha página funciona muito bem.
Em uma tentativa anterior “verify_peer”=>false
, configurei e passei isso como um argumento para file_get_contents, conforme descrito aqui: file_get_contents ignorando o confirm_peer => false? Mas como o escritor observou; não fez diferença.
Perguntei a um de nossos administradores de servidor se essas linhas em nosso arquivo php.ini existem:
- extension = php_openssl.dll
- allow_url_fopen = Ativado
Ele me disse que, como estamos no Gentoo, o openssl é compilado quando construímos; e não está definido no arquivo php.ini.
Também confirmei que allow_url_fopen
está funcionando. Devido à natureza especializada deste problema; Não estou encontrando muitas informações para obter ajuda. Algum de vocês se deparou com algo assim? Obrigado.
fonte
Respostas:
Este foi um link extremamente útil para encontrar:
http://php.net/manual/en/migration56.openssl.php
Um documento oficial descrevendo as alterações feitas para abrir o ssl no PHP 5.6 A partir daqui, aprendi mais um parâmetro que deveria ter definido como false: "confirm_peer_name" => false
Portanto, meu código de trabalho se parece com isso:
fonte
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Você não deve simplesmente desativar a verificação. Em vez disso, você deve baixar um pacote de certificados, talvez o pacote curl funcione?
Então você só precisa colocá-lo no seu servidor web, dando ao usuário que executa o php permissão para ler o arquivo. Então este código deve funcionar para você:
Felizmente, o certificado raiz do site que você está tentando acessar está no pacote de ondulação. Caso contrário, isso ainda não funcionará até você obter o certificado raiz do site e colocá-lo no seu arquivo de certificado.
fonte
stream_context_set_default
que pode ser usado para que você não tem que passá-lo em file_get_contents todaCorrigi isso corrigindo o OpenSSL instalado na minha máquina e adicionando-o ao meu php.ini:
fonte
cert.pem
arquivo e defini-lophp.ini
como este, e funcionou:openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Você pode solucionar esse problema escrevendo uma função personalizada que usa curl, como em:
Em seguida, basta usar em
file_get_contents_curl
vez defile_get_contents
sempre que você estiver chamando um URL que começa com https.fonte
Trabalhando para mim, estou usando o PHP 5.6. A extensão openssl deve estar ativada e, ao ligar para o mapa do Google api confirm_peer make false Abaixo, o código está funcionando para mim.
fonte
Se a sua versão do PHP for 5, tente instalar o cURL digitando o seguinte comando no terminal:
fonte
cURL
.sudo port install php70-curl
Basicamente, você deve definir a variável de ambiente SSL_CERT_FILE para o caminho do arquivo PEM do certificado SSL baixado do seguinte link: http://curl.haxx.se/ca/cacert.pem .
Levei muito tempo para descobrir isso.
fonte
as etapas a seguir corrigirão esse problema,
curl.cainfo
e cole o caminho absoluto no qual você baixou o certificado.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
espero que ajude !!
fonte
Só queria acrescentar isso, já que encontrei o mesmo problema e nada que eu pudesse encontrar em qualquer lugar funcionaria (por exemplo, fazer o download do arquivo cacert.pem, definir cafile no php.ini etc.)
Se você estiver usando o NGINX e seu certificado SSL for fornecido com um "certificado intermediário", será necessário combinar o arquivo intermediário com o arquivo principal "mydomain.com.crt" e ele deverá funcionar. O Apache possui uma configuração específica para certificados intermediários, mas o NGINX não possui, portanto deve estar no mesmo arquivo que o seu certificado regular.
fonte
O motivo desse erro é que o PHP não possui uma lista de autoridades de certificação confiáveis.
O PHP 5.6 e posterior tentam carregar as CAs confiáveis pelo sistema automaticamente. Problemas com isso podem ser corrigidos. Veja http://php.net/manual/en/migration56.openssl.php para mais informações.
O PHP 5.5 e versões anteriores são realmente difíceis de configurar corretamente, pois você precisa especificar manualmente o pacote CA em cada contexto de solicitação, algo que você não deseja espalhar pelo seu código. Então, decidi pelo meu código que, nas versões PHP <5.6, a verificação SSL simplesmente fica desativada:
fonte
Teve o mesmo erro com o PHP 7 no XAMPP e OSX.
A resposta acima mencionada em https://stackoverflow.com/ é boa, mas não resolveu completamente o problema para mim. Eu tive que fornecer a cadeia de certificados completa para fazer o file_get_contents () funcionar novamente. Foi assim que eu fiz:
Obter certificado raiz / intermediário
Antes de tudo, tive que descobrir qual é a raiz e o certificado intermediário.
A maneira mais conveniente é talvez uma ferramenta de certificação on-line como o ssl-shopper
Lá encontrei três certificados, um certificado de servidor e dois certificados de cadeia (um é a raiz, o outro aparentemente o intermediário).
Tudo o que preciso fazer é pesquisar na internet os dois. No meu caso, esta é a raiz:
descodificação DV SSL SHA256 CA
E isso leva ao seu URL thawte.com . Então, eu apenas coloquei esse certificado em um arquivo de texto e fiz o mesmo para o intermediário. Feito.
Obter o certificado do host
A próxima coisa que eu precisava fazer era baixar meu certificado de servidor. No Linux ou OS X, isso pode ser feito com o openssl:
Agora junte todos eles
Agora basta mesclar todos eles em um arquivo. (Talvez seja bom apenas colocá-los em uma pasta, apenas os fundi em um arquivo). Você pode fazer assim:
diga ao PHP onde encontrar a cadeia
Existe esta útil função openssl_get_cert_locations () que lhe dirá onde o PHP está procurando por arquivos cert. E existe esse parâmetro, que informará ao file_get_contents () onde procurar arquivos cert. Talvez os dois lados funcionem. Eu preferi o parâmetro way. (Comparado com a solução mencionada acima).
Então este é agora o meu código PHP
Isso é tudo. file_get_contents () está funcionando novamente. Sem CURL e espero que sem falhas de segurança.
fonte
chain.pem
? É issochain.crt
?Depois de ser vítima desse problema no centOS após atualizar o php para php5.6, encontrei uma solução que funcionou para mim.
Obtenha o diretório correto para seus certificados serem colocados por padrão com este
Em seguida, use isso para obter o certificado e colocá-lo no local padrão encontrado no código acima
fonte
Tive o mesmo problema de SSL na minha máquina do desenvolvedor (php 7, xampp no windows) com um certificado autoassinado tentando abrir um arquivo " https: // localhost / ...". Obviamente, o conjunto de certificados raiz (cacert.pem) não funcionou. Acabei de copiar manualmente o código do arquivo apache server.crt no arquivo cacert.pem baixado e fiz a entrada openssl.cafile = path / to / cacert.pem no php.ini
fonte
Outra coisa a tentar é reinstalar
ca-certificates
como detalhado aqui .E outra coisa a tentar é permitir explicitamente o certificado de um site em questão, conforme descrito aqui (especialmente se o site for o seu próprio servidor e você já tiver o .pem ao seu alcance).
Eu estava enfrentando esse erro de SO exato depois de atualizar para o PHP 5.6 no CentOS 6, tentando acessar o próprio servidor que possui um certificado de segurança de baixo custo que talvez precise ser atualizado, mas em vez disso instalei um certificado letsencrypt e com as duas etapas acima. o truque. Não sei por que o segundo passo foi necessário.
Comandos úteis
Exibir versão openssl:
Veja as configurações atuais do PHP CLI SSL:
fonte
Em relação a erros semelhantes a
Você verificou as permissões do certificado e dos diretórios referenciados pelo openssl?
Você consegue fazer isso
Para obter algo semelhante a este
Esse problema me frustrou por um tempo, até que percebi que minha pasta "certs" tinha 700 permissões, quando deveria ter 755 permissões. Lembre-se, essa não é a pasta para chaves, mas certificados. Eu recomendo ler este link com permissões ssl.
Uma vez eu fiz
O problema foi corrigido, pelo menos para mim de qualquer maneira.
fonte
Eu tive o mesmo problema em outra página segura ao usar
wget
oufile_get_contents
. Muitas pesquisas (incluindo algumas das respostas sobre essa pergunta) resultaram em uma solução simples - instalação do Curl e PHP-Curl - Se eu entendi corretamente, o Curl tem a CA raiz da Comodo que resolveu o problemaInstale os complementos Curl e PHP-Curl e reinicie o Apache
Tudo agora trabalhando.
fonte