Ruby 2.7和TLS 1.3与RestClient不工作

b09cbbtk  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(150)

我在尝试请求使用TLS 1.3的端点时遇到问题

require 'base64'
require 'openssl'
require 'rest-client'

auth_payload = {
  grant_type: 'client_credentials',
  scope: 'cobrancas.boletos-info cobrancas.boletos-requisicao'
}

encoded_token = Base64.strict_encode64(
  'MY_CLIENT_ID:MY_CLIENT_SECRET'
)

response = RestClient::Request.execute(
  method: 'post',
  url: "https://oauth.sandbox.bb.com.br/oauth/token",
  payload: auth_payload,
  verify_ssl: OpenSSL::SSL::VERIFY_NONE,
  headers: {
    content_type: 'application/x-www-form-urlencoded',
    authorization: "Basic #{encoded_token}"
  }
)

我尝试删除verify_ssl并添加ssl_version: 'TLSv1_3',结果返回错误unknown SSL method TLSv1_3 (ArgumentError)
传递verify_ssl: OpenSSL::SSL::VERIFY_NONE属性有时候可以工作,有时候会返回错误Connection reset by peer - SSL_connect (Errno::ECONNRESET)
如果不传递verify_sslssl_version属性,则返回错误SSL_connect returned=1 errno=0 peeraddr=1.1.1.1:443 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError)
尝试使用Ruby 2.7.6和3.1.2都不工作。
通过CURL,每次我尝试它都有效(而且有很多)

curl -X POST https://oauth.sandbox.bb.com.br/oauth/token -v \
     -H "Authorization: Basic ${MY_TOKEN}" \
     -d "grant_type=client_credentials"

我在互联网上做了很多研究,据我所知,Ruby仍然不支持使用TLS 1.3的https端点,对吗?

ars1skjm

ars1skjm1#

OPEN_SSL已弃用ssl_version参数,请尝试使用此处提到的min_version
我看到你正在使用RestClient,这可能是因为gem没有更新为使用OpenSSL的新格式。
您可以使用下面的代码来测试控制台的SSL版本。

hostname = "google.com"
ctx = OpenSSL::SSL::SSLContext.new()
s = TCPSocket.new(hostname, 443)
ssl = OpenSSL::SSL::SSLSocket.new(s, ctx)
ssl.hostname = hostname
ssl.connect
p ssl.ssl_version # "TLSv1.3"

相关问题