ruby-on-rails - SSL_connect 返回=1 errno=0 state=error: 证书验证失败(无法获取本地颁发者证书)
问题描述
我正在尝试从我的应用程序发布到 Web 服务,但我经常收到以下错误。
SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate)
我使用 compassplus 发布的 crt 文件和我自己生成的密钥文件发送 post 请求。
def payment
@booking = 12
uri = URI("https://test.compassplus.com:8444/Exec")
xml = Builder::XmlMarkup.new
xml.instruct! :xml, :version => '1.0'
xml.TKKPG {
xml.Request {
xml.Operation("CreateOrder")
xml.language("EN")
xml.Order {
xml.OrderType("Purchase")
xml.Merchant("123456")
xml.Amount("10000")
xml.Currency("840")
xml.Description("Tour Purchase")
xml.ApproveURL("/thankyou.html")
xml.CancelURL("/error.html")
xml.DeclineURL("/declined.html")
xml.email("")
xml.phone("")
xml.AddParams {
xml.FADATA("")
xml.SenderPostalCode("")
xml.AcctType("")
xml.TranAddendums("")
xml.TranAdddendumsVISA("")
xml.TranAdddendumsMC("")
xml.TranAdddendumsAMEX("")
xml.TranAdddendumsJCB("")
xml.OrderExpirationPeriod("")
xml.OrigAmount("")
xml.OrigCurrency("")
}
}
}
}
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :TLSv1_2
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = File.read(File.join(Rails.root, "/crt/gvtrek.com.pem"))
@request = http.post(uri, xml)
end
当我从本地主机发送发布请求时出现 SSL 错误,当我从生产中发送它时出现超时。我无法弄清楚问题所在。帮我把它修好。我正在开发 macOS Mojave。
解决方案
经过大量测试,我找到了正确的解决方案。问题出在证书文件声明上。
我尝试使用捆绑的证书文件(example.com.pem)发送发布请求
http.ca_file = File.read(File.join(Rails.root, "/crt/example.com.pem"))
所以,我用每个 crt 和 key 文件更改了上面的声明
http.cert = OpenSSL::X509::Certificate.new(File.read(File.join(Rails.root, "/crt/example.com.crt")))
http.key = OpenSSL::PKey::RSA.new(File.read(File.join(Rails.root, "/crt/example.com.key")))
req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/xml'}).
它现在起作用了。
完整代码
uri = URI("https://test.compassplus.com:8444/Exec")
xml = "
<TKKPG>
<Request>
<Operation>CreateOrder</Operation>
<Language></Language>
<Order>
<OrderType>Purchase</OrderType>
<Merchant>99999</Merchant>
<Amount>10000</Amount>
<Currency>524</Currency>
<Description>Tour Purchase</Description>
<ApproveURL>/approve.html</ApproveURL>
<CancelURL>/cancel.html</CancelURL>
<DeclineURL></DeclineURL>
<email></email>
<phone></phone>
<AddParams>
<FA-DATA></FA-DATA>
<SenderPostalCode></SenderPostalCode>
<AcctType></AcctType>
<TranAddendums></TranAddendums>
<TranAddendumsVISA></TranAddendumsVISA>
<TranAddendumsMC></TranAddendumsMC>
<TranAddendumsAMEX></TranAddendumsAMEX>
<TranAddendumsJCB></TranAddendumsJCB>
<OrderExpirationPeriod></OrderExpirationPeriod>
<OrigAmount></OrigAmount>
<OrigCurrency></OrigCurrency>
</AddParams>
<Fee></Fee>
</Order>
</Request>
</TKKPG>
"
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :TLSv1_2
http.cert = OpenSSL::X509::Certificate.new(File.read(File.join(Rails.root, "/crt/example.com.crt")))
http.key = OpenSSL::PKey::RSA.new(File.read(File.join(Rails.root, "/crt/example.com.key")))
req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/xml'})
@res = http.request(req, xml)
参考。
推荐阅读
- excel - MS Project 2016 - VBA 周期时间问题(提取到 Excel)
- gcc - 全局 yocto AM_CFLAGS 传递给 gcc 编译器
- python - IndexError:只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效的索引
- c++ - 两个 qtableviews,两个模型和相同的数据
- .net-core - .Net Core 自动生成的字符串主键
- c# - 如何要求实现接口的所有对象都具有某个字段
- python - 如何在 kivy + python 中作为函数访问
- android - 在网格布局选项中设置数据在第二次调用后不起作用
- javascript - Vue.js 在启动时清除引导对话框绑定数据
- docker - 在不使用 docker 的情况下安装 TensorFlow 服务