crafters / cielo

Gem para integração com os WebServices da Cielo
www.crafters.com.br
MIT License
85 stars 52 forks source link

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: wrong version number #22

Closed Sanmoo closed 9 years ago

Sanmoo commented 9 years ago

Olá,

Tenho uma aplicação rails (ruby 2.1.5, Rails 4.2.0) que usa esta gem para gerar um token. Tenho um modelo mais ou menos assim:

class CieloPaymentData < ActiveRecord::Base
  # virtual attributes
  attr_accessor :card_number, :validity, :carrier_name

  FLAGS = ["mastercard", "visa", "elo", "diners", "discover", "amex"]
  validates :card_flag, inclusion: FLAGS
  validates :bill_day, inclusion: 1..28

  before_validation :generate_token, unless: "card_token"

  def generate_token
    token_request = Cielo::Token.new
    token_parameters = {
      :cartao_numero => "#{self.card_number}",  
      :cartao_validade => Time.parse(self.validity).strftime("%Y%m"), 
      :cartao_portador => self.carrier_name 
    }

    # TODO verify this

    response = token_request.create! token_parameters, :store
    ...
  end
end

O token é gerado antes da validação. Na linha de geração de token, response = token_request.create! token_parameters, :store, o seguinte erro é retornado: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: wrong version number.

Esta parte do código é exercitada pela seguinte spec:

it "generates a token when card data is valid" do
  payment_data.card_token = nil
  # Valid data provided by cielo
  payment_data.card_flag = "mastercard"
  payment_data.card_number = "5453010000066167"
  payment_data.validity = "2018-05-01"
  expect(payment_data).to be_valid
  expect(payment_data.card_token).not_to be nil
end

Até ontem estes testes estavam passando.

felipero commented 9 years ago

Isso me parece com versão incompatível do SSL. Talvez a cielo tenha mudado a versão do certificado. Dá uma olhada nesse post aqui: http://stackoverflow.com/questions/26644867/ssl-connect-returned-1-errno-0-state-sslv3-read-server-hello-a-wrong-version-nu Tenta achar qual é a versão atual do servidor da Cielo e confere qual é o seu. Se for diferente, iguale o seu ao deles que o erro deve desaparecer. Se forem iguais, teremos que investigar mais a fundo.

felipero commented 9 years ago

O da gem Cielo é declarado aqui: https://github.com/crafters/cielo/blob/master/lib/cielo/connection.rb#L15

felipero commented 9 years ago

Aindam segundo esse PDF aqui, https://www.cielo.com.br/documents/b771c7655be54bc983aba229162f0faa.pdf a versão a ser usada para conexão com a cielo é a SSL V3 que é a mesma que estamos usando. Talvez você tenha atualizado algo na sua máquina. Dá uma olhada em como atualizar o open ssl do seu ambiente.

Sanmoo commented 9 years ago

@felipero obrigado pela prontidão. Verifiquei no chrome o site https://qasecommerce.cielo.com.br/ e ele informou a versão do SSL: TLS 1.0. Não sei se TLS1.0 e SSL3.0 são tecnicamente a mesma coisa, mas mudei a linha que você indicou para TLS1.0 em um fork, referenciei no meu Gemfile e agora todos os meus testes passam =) https://github.com/Sanmoo/cielo/blob/master/lib/cielo/connection.rb#L15

felipero commented 9 years ago

TLS é diferente de SSLV3. Agora estou na dúvida sobre qual devo manter como o oficial da gem. Eu estou sem contrato com a Cielo, você pode enviar um email pro suporte deles e perguntar qual é a versão oficial que eles usam? Aí eu defino aqui com mais certeza.

Sanmoo commented 9 years ago

Nós ainda não nos credenciamos com a cielo. Assim que fizermos pergunto a eles.

marcusvmsa commented 9 years ago

Falei com eles no telefone, e ontem, domingo as 22hrs eles parecem ter mudado a versão do SSL mesmo, não estamos recebendo nenhum pagamento do cartão de crédito.

Me enviaram isso por e-mail

Conforme contato telefônico segue em anexo os certificados para atualização. Caso esteja utilizando a linguagem em php será necessário realizar a alteração descrita abaixo no include:

DE: curl_setopt($sessao_curl, CURLOPT_SSLVERSION, 3); 
PARA: curl_setopt($sessao_curl, CURLOPT_SSLVERSION, 4);
felipero commented 9 years ago

@mamute Não ajuda muito né. Esse código é em PHP. Não sei exatamente o que ele retorna. Talvez tentar uma versão ruby desse código e ver qual é o retorno ajude..

marcusvmsa commented 9 years ago

@felipero, verdade. Na real tá uma confusão isso, junto com o e-mail o suporte deles enviou um monte de certificados da própria CIELO com a justificativa que "as vezes o navegador não atualiza".

Enfim, pra testar eu mudei isso: https://github.com/mamute/cielo/blob/master/lib/cielo/connection.rb#L15 Só troquei pra TLSv1 e agora voltou a funcionar.

felipero commented 9 years ago

Pois é. Já que duas pessoas diferentes tiveram o problema, acho justo mudar para TSLv1 então. Algum de vocês quer mandar um pull request?

Sanmoo commented 9 years ago

@felipero, existe previsão de uma próxima versão com essa mudança?

felipero commented 9 years ago

Olá @Sanmoo, Eu tenho andado bem ocupado ultimamente. Se alguém puder mandar um Pull Request com a alteração, ajudaria muito. :)

Sanmoo commented 9 years ago

Opa @felipero, pensei que não precisava mais já que tem um commit no repositório que faz essa atualização. Vou fazer o pull request do que eu tenho então....

Aliás, vi aqui que o @mamute já fez esse pull request? É isso mesmo?

felipero commented 9 years ago

@Sanmoo parece que já mesmo. EU já até fiz o merge. :p

https://github.com/crafters/cielo/pull/23