You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 2.3.2应用对接S3遇InvalidTlsVersion错误求临时方案

问题描述

生产环境运行基于Rails 2.3.2和Ruby 1.8.7的应用,当前正在推进版本升级但尚未完成。该应用通过Paperclip gem与S3存储桶交互,因AWS停止支持TLS 1.0和TLS 1.1,上传图片时出现以下错误:

##### RightAws::S3Interface returned an error: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidTlsVersion</Code><Message>Amazon S3 will stop supporting TLS 1.0 and TLS 1.1 connections. Please update your client to use TLS version 1.2 or above. To learn more and to update your client, see https://go.aws/3AUlVSb . For further assista$
##### RightAws::S3Interface request: https://bucketname.s3.amazonaws.com:443/?prefix=images%2Fimages%mnm%2Foriginal.jpg  ####
Closing HTTPS connection to bucketname.s3.amazonaws.com:443, reason: 'RightAws::AWSErrorHandler: code: 403: 'Forbidden''

RightAws::AwsError (InvalidTlsVersion: Amazon S3 will stop supporting TLS 1.0 and TLS 1.1 connections. Please update your client to use TLS version 1.2 or above. To learn more and to update your client, see https://go.aws/3AUlVSb . For further assistance, co$
  /home/ubuntu/.rvm/gems/ruby-1.8.7-p371@vires/gems/right_aws-3.0.4/lib/awsbase/right_awsbase.rb:562:in `request_info_impl'
  /home/ubuntu/.rvm/gems/ruby-1.8.7-p371@vires/gems/right_aws-3.0.4/lib/s3/right_s3_interface.rb:203:in `request_info'
  /home/ubuntu/.rvm/gems/ruby-1.8.7-p371@vires/gems/right_aws-3.0.4/lib/s3/right_s3_interface.rb:362:in `incrementally_list_bucket'
  /home/ubuntu/.rvm/gems/ruby-1.8.7-p371@vires/gems/right_aws-3.0.4/lib/s3/right_s3.rb:239:in `keys_and_service'
  /home/ubuntu/.rvm/gems/ruby-1.8.7-p371@vires/gems/right_aws-3.0.4/lib/s3/right_s3.rb:225:in `keys'
  /home/ubuntu/.rvm/gems/ruby-1.8.7-p371@vires/gems/right_aws-3.0.4/lib/s3/right_s3.rb:266:in `key'
  vendor/plugins/paperclip/lib/paperclip/storage.rb:180:in `exists?'
  vendor/plugins/paperclip/lib/paperclip/attachment.rb:397:in `queue_existing_for_delete'
  vendor/plugins/paperclip/lib/paperclip/attachment.rb:396:in `map'
  vendor/plugins/paperclip/lib/paperclip/attachment.rb:396:in `queue_existing_for_delete'
  vendor/plugins/paperclip/lib/paperclip.rb:338:in `send'...

已尝试AWS官方教程但未成功,因对AWS不熟悉可能存在配置或理解偏差,求应用升级完成前的临时解决方案,让请求恢复正常。


临时解决方案

针对Ruby 1.8.7和right_aws gem的场景,有以下几种可行的临时修复方式:

1. 强制right_aws使用TLS 1.2

Ruby 1.8.7本身支持TLS 1.2,但默认可能未启用。需要修改right_aws的配置,强制请求使用TLS 1.2:

  • 在应用初始化文件(比如config/initializers/right_aws.rb)中添加以下代码:
require 'right_aws'
RightAws::S3Interface.class_eval do
  def ssl_version
    :TLSv1_2
  end
end
  • 这个修改会覆盖right_aws默认的SSL版本设置,强制所有S3请求使用TLS 1.2。

2. 更新OpenSSL版本

Ruby 1.8.7依赖系统的OpenSSL库,确保服务器上的OpenSSL版本至少为1.0.1c(该版本开始支持TLS 1.2):

  • 查看当前OpenSSL版本:openssl version
  • 如果版本过低,升级系统的OpenSSL包(以Ubuntu为例):
sudo apt-get update
sudo apt-get install openssl libssl-dev
  • 重新编译Ruby 1.8.7,确保它链接到新的OpenSSL库:
rvm reinstall ruby-1.8.7-p371 --with-openssl-dir=/usr/local/ssl

3. 替换right_aws为支持TLS 1.2的分支/补丁

如果上述方法无效,可以尝试使用社区维护的right_aws补丁版本:

  • 修改Gemfile(如果使用Bundler,或者直接修改gem配置),指向支持TLS 1.2的分支:
gem 'right_aws', git: 'https://github.com/your-fork/right_aws.git', branch: 'tls1.2-fix'
  • 或者手动下载补丁,修改right_aws的right_awsbase.rb文件,在请求时指定SSL版本为TLSv1_2。

4. 使用反向代理中转请求(备选方案)

如果上述代码/环境修改都无法实施,可以在应用和S3之间搭建一个反向代理(比如Nginx),让代理处理TLS 1.2连接:

  • 配置Nginx作为反向代理,将应用的S3请求转发到S3端点,同时强制代理使用TLS 1.2:
server {
  listen 8080;
  server_name s3-proxy.local;

  location / {
    proxy_pass https://bucketname.s3.amazonaws.com;
    proxy_ssl_protocols TLSv1.2;
    proxy_set_header Host bucketname.s3.amazonaws.com;
    proxy_set_header Authorization $http_authorization;
  }
}
  • 修改应用的Paperclip配置,将S3端点指向代理地址:
Paperclip::Attachment.default_options[:s3_host_name] = 's3-proxy.local:8080'

内容的提问来源于stack exchange,提问作者Sara Fuerst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:17:01