Ruby on Rails开发环境下如何调用HTTPS第三方API?
解决开发阶段调用HTTPS API的证书验证失败问题
嘿,这个SSL证书验证失败的问题在本地开发时真的超常见!你碰到的SSL_connect returned=1 errno=0 state=error: certificate verify failed错误,本质是Ruby的Net::HTTP默认会严格校验SSL证书,而本地开发环境没配置好信任目标API的证书。下面给你几个开发阶段能用的方案:
临时禁用证书验证(仅开发调试用!)
如果只是想快速跑通代码调试,你可以临时关闭SSL证书验证,但绝对绝对不要在生产环境这么做——这会直接把你的请求暴露给中间人攻击的风险。修改后的代码如下:
require 'net/http' require 'net/https' http = Net::HTTP.new("mydomain.com", 443) http.use_ssl = true # 新增这一行关闭证书验证,仅开发用! http.verify_mode = OpenSSL::SSL::VERIFY_NONE resp, result = http.get("/secure/example") p result
规范方案:配置信任证书(推荐)
要是想保持安全校验的同时解决问题,有两种靠谱的做法:
1. 指定第三方API的CA证书
如果这个API用的是自签名证书或者私有CA颁发的证书,你可以把对应的CA证书文件(比如my_api_ca.pem)放到项目目录里,然后在代码里指定证书路径:
require 'net/http' require 'net/https' http = Net::HTTP.new("mydomain.com", 443) http.use_ssl = true # 替换成你的CA证书实际路径 http.ca_file = "./my_api_ca.pem" resp, result = http.get("/secure/example") p result
2. 更新Ruby的根证书存储
如果目标API是公开的正规服务,那大概率是你的Ruby环境自带的根证书过期了。可以通过certifi gem来更新根证书库:
先安装gem:
gem install certifi
然后在代码里指定更新后的证书路径:
require 'net/http' require 'net/https' require 'certifi' http = Net::HTTP.new("mydomain.com", 443) http.use_ssl = true # 使用certifi提供的最新根证书 http.ca_file = Certifi.where resp, result = http.get("/secure/example") p result
重要提醒
一定要记住:关闭证书验证只是开发时的临时手段,生产环境必须启用完整的SSL证书校验,不然会带来严重的安全漏洞。如果是正规公开API,优先用更新根证书的方式解决问题哦~
内容的提问来源于stack exchange,提问作者dcporter7
相关产品推荐
相关产品推荐

