Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ssl handshake com Sefaz de GO e mudanças de url #31

Closed
diogoamatos opened this issue Mar 13, 2015 · 4 comments
Closed

Ssl handshake com Sefaz de GO e mudanças de url #31

diogoamatos opened this issue Mar 13, 2015 · 4 comments

Comments

@diogoamatos
Copy link

Não consegui obter conexão com Sefaz de Goias, me retorna este erro:

Traceback (most recent call last):
  File "/opt/odoo8/parts/l10n_br/odoo-brazil-eletronic-documents/nfe/account_invoice.py", line 133, in action_invoice_send_nfe
    for processo in send(company, nfe):
  File "/opt/odoo8/src/PySPED/pysped/nfe/processador_nfe.py", line 788, in processar_notas
    proc_consulta = self.consultar_nota(ambiente=nfe.infNFe.ide.tpAmb.valor, chave_nfe=nfe.chave)
  File "/opt/odoo8/src/PySPED/pysped/nfe/processador_nfe.py", line 700, in consultar_nota
    self._conectar_servico(WS_NFE_CONSULTA, envio, resposta, ambiente)
  File "/opt/odoo8/src/PySPED/pysped/nfe/processador_nfe.py", line 326, in _conectar_servico
    con.request(b'POST', b'/' + self._url.encode('utf-8'), self._soap_envio.xml.encode('utf-8'), self._soap_envio.header)
  File "/usr/lib/python2.7/httplib.py", line 973, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 1007, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 969, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 829, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 791, in send
    self.connect()
  File "/opt/odoo8/src/PySPED/pysped/nfe/processador_nfe.py", line 170, in connect
    ssl_version=ssl.PROTOCOL_TLSv1)
  File "/usr/lib/python2.7/ssl.py", line 487, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 243, in __init__
    self.do_handshake()
  File "/usr/lib/python2.7/ssl.py", line 405, in do_handshake
    self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:510: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate 

Quando tento pelo arquivo python 005_versao_2.00_consultar_situacao_servidor.py obtenho a mesma resposta. Verifiquei o certificado utilizado e ele é válido.

Suponho que a conexão esteja sendo recusada devido à apresentação da cadeia certificadora:
http://www.nfe.go.gov.br/post/ver/182650/obrigatoriedade-de-apresentacao-de-cadeia-de-certificacao-completa
Não consegui verificar a utilização da Cadeia no PySped, e mesmo forçando o uso de certificado ou TLSv1 no arquivo processador_nfe.py linha 167.

self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3)

Foi testado em mais de uma máquina, chegando no mesmo erro. Consulta de status de serviço em outros webservices funcionam perfeitamente, mesmo sem modificar o certificado.

Em todos os casos não obtive sucesso, alguma solução?

Obs.
Alguns endereços para Nfe 3.10 irão mudar e já estão em homologação:
http://www.nfe.go.gov.br/post/ver/194555/alteracao-de-web-service
http://hom.nfe.fazenda.gov.br/portal/webServices.aspx#GO

@alanjds
Copy link
Collaborator

alanjds commented Mar 13, 2015

@diogoamatos Qual a versão do Python que você está usando?

Pergunto porque na atualização de 2.7.8 para 2.7.9 surgiu uma mudança no módulo de SSL que passou a checar os certificados das conexões. Isso é uma coisa boa. A parte ruim é que, por padrão, vão quebrar as conexões a servidores SSL auto-assinados, caso da maioria dos serviços do governo.

Detalhes:
https://www.python.org/dev/peps/pep-0476/
https://www.python.org/downloads/release/python-279/

@diogoamatos
Copy link
Author

Olá Alan,

Estava utilizando o python 2.7.6, tentei com o 2.7.9 mas também não obtive sucesso.

O problema com o sefaz de Goias era realmente o envio da cadeia completa de certificação, então criei um arquivo com o certificado a ser utilizado e os certificados intermediários e raiz certificadora (link que enviei na issue).

Adicionei o .pem criado na chamada (linha 167 do processador_nfe.py):

self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1,
ca_certs="/path/to/cert/chain.pem)

A partir disso comecei a obter resposta do sefaz.

Obrigado.

@mileo
Copy link
Contributor

mileo commented Mar 18, 2015

💯

@ananiasfilho
Copy link

Srs. boa tarde!
Conforme informado no ano passado, há problemas de comunicação com alguns SEFAZ por conta de SSLv3. Todos os SEFAZ aceitam TLSv1 e TLSv1.2 que são considerados seguros as falhas do poodle por exemplo.
Recentemente tivemos problemas com SEFAZ Goias e Minas Gerais que só aceitam o TLSv1 e TLSv1.2. Garantam que não serão utilizados SSLv3 e alterem a linha a 167 conforme informado pelo @diogoamatos.

De:
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3, do_handshake_on_connect=False)

Para:
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1, do_handshake_on_connect=False

mbcosta pushed a commit to akretion/PySPED that referenced this issue Jul 27, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants