我有一个在Heroku服务器上运行的Rails应用,但在通过HTTPS使用Net :: HTTP与外部服务器通信时遇到问题。每当我尝试POST
通过HTTPS访问外部专有API时收到的错误是:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
我已经花了几个小时的时间来Google搜索,以解决我遇到的问题,但无济于事。这是我的环境:
我尝试过的“修复”:
certified
gem(实际上似乎有助于通过Omniauth和Google的API进行通信)Net::HTTP::Post.new
而不是运行时,似乎完全忽略了调整Net::HTTP::Get.new
ssl_version="TLSv1_2"
,但没有运气(它甚至一直报告相同的SSLv3相关错误)当在开发环境中本地运行时,通信似乎运行良好(我已经使用了此处建议的RVM覆盖方法),但是当我在Heroku服务器上尝试操作时,我很不走运。
更新:看来,即使使用RVM更新,它也不在本地工作。
最后但并非最不重要的是,这是我正在运行的代码的抽象变体:
uri = URI.parse("https://api.mysite.com/api/v1")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
request = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json'})
request_body = "{\"post_body\": \"data1\"}"
response = http.request(request)
有人对我还要看的东西有什么建议吗?
Heroku无法验证服务器的证书是否由其识别的CA根有效签名。这可能是因为:
尝试openssl s_client -showcerts -connect your-api-host.com:443
从您的外壳。您应该看到类似以下内容:
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = www.coffeepowered.net
verify return:1
您特别希望确保链中的所有证书都返回verify return: 1
。如果这在您的Shell上有效,则您的计算机可能安装了Heroku实例未安装的根证书。
在不确切知道您的API服务器将返回什么证书的情况下,很难确定答案,但是您可能需要将中间证书包与SSL证书本身一起提供。此中间证书捆绑包将由您的SSL证书签名者提供,并且可以通过SSLCertificateChainFile在Apache中提供,或者通过将中间件与您的证书连接(在本文档中)在nginx中提供。
如果您无法更改API服务器的配置,则您的“手动覆盖证书文件位置”解决方案可能非常接近正确(这与提供中间证书的服务器相同,只是客户端可以这样做),但是您可能没有为API服务器的证书提供正确的证书链捆绑包。确保您具有正确的提供给OpenSSL的中间证书链,并且该链应该可以按需工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句