nfephp-org / sped-nfe

API para geração e comunicação das NFe com as SEFAZ autorizadoras
Other
1.22k stars 535 forks source link

Funciona no PHP 8.1 mas erro no PHP 8.2 e 8.3 #1038

Closed rodrigomgrassioto closed 6 months ago

rodrigomgrassioto commented 6 months ago

Olá a todos, sou novato então me descupem se estou postando no lugar errado, mas acredito que esteja correto devido o erro ocorrer após mudar a versão do PHP. Mesmo assim, já pedi para participar no grupo Google.

Em ambiente DEV estou utilizando o Laragon e quando estou utilizando o PHP 8.1.10 consigo emitir a NFe em ambiente de homologação normalmente.

Agora se eu mudo para o PHP 8.2.18 ou 8.3.6 recebo o erro: NFePHP\Common\Exception\CertificateException: Impossivel ler o certificado, ocorreu o seguinte erro: (error:0308010C:digital envelope routines::unsupported) in file D:\laragon600\www\levoJa-back-bkp\vendor\nfephp-org\sped-common\src\Exception\CertificateException.php on line 17

Ao voltar para o PHP 8.1 volta a funcionar.

O que devo verificar?

robmachado commented 6 months ago

Esse problema provavelmente é causado pelo OpenSSL. Para resolver terá de habilitar o modo "Legacy"

rodrigomgrassioto commented 6 months ago

Boa tarde. Muito obrigado pela resposta rápida. Já me ajudou muito. Verifiquei que no PHP 8.1 o OpenSSL é o 1.1.1q 5 Jul 2022 e nas outras duas vesões do PHP o OpenSSL é o 3.0.13 30 Jan 2024 E por minha ignorancia fui pesquisar como habilitar o modo "Legacy" e encontrei o essa matéria:

https://help.heroku.com/88GYDTB2/how-do-i-configure-openssl-to-allow-the-use-of-legacy-cryptographic-algorithms Caso aqui não possa postar link podem excluir o link sem problemas

Então com o PHP 8.3 executei os comandos: `$ openssl pkcs12 -legacy -in client.p12 -nodes -out cert-decrypted.tmp

(enter passphrases if prompted)

$ openssl pkcs12 -in cert-decrypted.tmp -export -out client-new.p12

(enter passphrases if prompted)

$ rm cert-decrypted.tmp`

Obs: O meu certificado é pfx então troquei o .p12 por pfx .

A principio parece que foi o suficiente atualizar o certificado. Irei fazer mais alguns testes.

Novamente, muito obrigado desde já.

robmachado commented 6 months ago

o OpenSSL versão 3.* em diante, não opera com os certificados gerados no Brasil (modelo A1) por isso teria de ativar o modo Legacy, sem esse modo "legado" o openssl provoca uma série de erros. Para ativar o modo legacy são configurações a serem feitas no openssl.conf. Eu não uso esse tipo de ferramenta como o Laragon (meu ambiente é Linux/MacOS) então ou tenho os pacotes instalados diretamente nas minhas maquinas de dev ou uso o Docker (para ficar mais próximo dos servidores reais). Mas acredito que haja forma de mudar isso no Laragon usando no arquivo openssl.conf.tpl.

joaoroyosilva commented 6 months ago

Aqui resolvo alterando /etc/ssl/openssl.conf

[provider_sect] default = default_sect legacy = legacy_sect

[default_sect] activate = 1

[legacy_sect] activate = 1

Ubuntu 22.04 + PHP 8.2, precisa reiniciar o PHP

robmachado commented 6 months ago

É isso mesmo João, mas ele está usando o Laragon que é um ambiente pre-montado tipo "xampp", mas bem melhor pelo que eu li na documentação, ai teria de fazer testes para ver se colocando essas linhas de configuração no arquivo openssl.conf.tpl (um template) fará diferença.

rodrigomgrassioto commented 6 months ago

Aqui resolvo alterando /etc/ssl/openssl.conf

[provider_sect] default = default_sect legacy = legacy_sect

[default_sect] activate = 1

[legacy_sect] activate = 1

Ubuntu 22.04 + PHP 8.2, precisa reiniciar o PHP

Boa noite amigo, muito obrigado pela ajuda.

Acredito que pro ambiente do Laragon, o arquivo seria este: D:\laragon600\bin\php\php-8.3.6-Win32-vs16-x64\extras\ssl\openssl.cnf

Originalmente ele tem as linhas: [provider_sect] default = default_sect

[default_sect] activate = 1

Então acredito que seria só incluir as outras linhas que vc postou para ativar a opção Legacy, certo?

Vou salvar esse post para referencia futura. Mas por enquanto está funcionando normalmente após decripar o certificado e re-exportar. Um detalhe que vi no código agora é que tem o comando legacy.

`$ openssl pkcs12 -legacy -in client.p12 -nodes -out cert-decrypted.tmp

Muito obrigado a todos

jaisonn commented 2 months ago

Para quem estiver enfrentando o problema, eu só consegui resolver com o seguinte arquivo de configuração:

openssl_conf = openssl_init
[openssl_init]
providers = provider_sect
[provider_sect]
default = default_sect
legacy = legacy_sect
[default_sect]
activate = 1
[legacy_sect]
activate = 1

Estou usando php:8.2-fpm