ruby-on-rails – Heroku Rails Net :: HTTP:OpenSSL :: SSL ::
我有一个在Heroku服务器上运行的Rails应用程序,我在通过HTTPS使用Net :: HTTP与外部服务器通信时遇到问题.每当我尝试通过HTTPS POST到外部专有API时,我收到的错误是:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed 我已经花了几个小时的谷歌搜索来解决我遇到的问题,但无济于事.这是我的环境: > Heroku Dyno运行Cedar 14(正在运行Cedar 10,升级到Cedar 14,看它是否会影响问题 – 没有快乐) “修复”我尝试过: > Running the 在开发中本地运行时,通信似乎工作得很好(我使用过RVM override method suggested here),但是当我在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根有效签名.这可能是因为:
>您的证书未经CA或中间人签署(即自签名) 从shell中尝试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,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 您特别希望确保链中的所有证书都返回验证返回:1.如果这可以从您的shell运行,那么您的计算机可能已安装了您的Heroku实例没有的根证书. 在不确切知道您的API服务器返回哪些证书的情况下,很难明确地回答这个问题,但您可能需要提供中间证书捆绑以及SSL证书本身.此中间证书包将由您的SSL证书签名者提供,可以通过SSLCertificateChainFile在Apache中提供,也可以通过将中间人与您的证书相连接在nginx中提供(根据this documentation). 如果您无法更改API服务器的配置,那么您的“手动覆盖证书文件位置”解决方案可能非常接近正确(这与提供中间证书的服务器相同,除了客户端执行此操作),但您可能没有为API服务器的证书提供正确的证书链包.确保为OpenSSL提供了正确的中间证书链,并且它应该可以正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |