使用Active Merchant for Moneris的OpenSSL错误

时间:2013-10-01 22:29:58

标签: ruby-on-rails-3 ssl heroku https

我的制作应用使用ActiveMerchant,无法使用单个网关Moneris通过https处理信用卡。所有其他网关Authorize.net,Paypal,Beanstream等)都没有遇到任何错误。我收到的错误是:

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):

Moneris的人告诉我他们已经更新了他们的SSL证书  到2048位SSL加密(来自当前的1024 SSL加密),升级的证书将由VeriSign颁发。我们的通配符SSL使用2432 - 超过了Moneris 2047的要求。

因此,他们建议除了我通常为我的SSL捆绑包上传的文件外,我还要添加他们的Verisign证书。我的Heroku命令如下所示:

$ heroku certs:upgrade --app myapp AddTrustExternalCARoot.crt ComodoUTNSGCCA.crt EssentialSSLCA_2.crt STAR_myapp_com.crt UTNAddTrustSGCCA.crt Verisign_chain_Gr.cer Verisign_G5.cer server.key

我已经尝试了几乎所有的东西,包括这里的fix_ssl.rb建议(OpenSSL::SSL::SSLError on Heroku),我在Heroku的/ usr / lib / ssl / certs目录中调用了ca-certificates.crt。

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=
    def use_ssl=(flag)
      self.ca_path = Rails.root.join('/usr/lib/ssl/certs/ca-certificates.crt').to_s
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

我已经尝试了所有方法:将Heroku软件包放在我的/ lib目录中,添加“认证”宝石等等,并在电话上花了几个小时与Moneris无济于事。有谁知道我还能做些什么来让这个网关处理信用卡?

1 个答案:

答案 0 :(得分:3)

我的猜测是openssl用于验证Moneris服务器证书的CA证书的可信列表已过时。所以尝试从Mozilla的ca-bundle中提取cacert.pem(http://curl.haxx.se/docs/caextract.html为你做这个)。这对于openssl来说更加必要,因为openssl不再与CA证书捆绑在一起,这就是为什么我怀疑你使用的ca-cert可能已经过时了。

首先,我尝试使用以下命令重现您的问题:

openssl s_client -connect www3.moneris.com:443

得到......


New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : RC4-MD5
    Session-ID: 73178D4019035AE86399D0E6D2FFB904A1412D0F5D3F83370E52F50E9E26B73C
    Session-ID-ctx: 
    Master-Key: 0BB841912F11185B7CBAFA524571765DD7372990819EBC44E311DE4EF0C70E480501D6F87C8AA439C4F827B0908123F7
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1380816775
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

然后我使用了从Mozilla中提取的cacert.pem感谢http://curl.haxx.se/docs/caextract.html 并重新发布了openssl命令:

openssl s_client -connect www3.moneris.com:443 -CAfile cacert.pem

得到......


New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : RC4-MD5
    Session-ID: 73178D401902F7EB6399D0E6D2FFB804CE0F7219344405EA0E52F50E9E26B4DB
    Session-ID-ctx: 
    Master-Key: C0B32810FB7E0158A156E7D05DBB35F3CE8935284F165C3FB636700EEEC8BCE991BCE8850D39020E298F337B6E58132A
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1380816992
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

因此,在上面的代码段中,请尝试替换:


self.ca_path = Rails.root.join('/usr/lib/ssl/certs/ca-certificates.crt').to_s

使用:


self.ca_file = <full path name>/cacert.pem

其中cacert.pem是从Mozilla ca-bundle中提取的