JRuby环境下AWS S3上传PDF遇Seahorse网络错误求助
报错信息:
Seahorse::Client::NetworkingError - No appropriate protocol (protocol is disabled or cipher suites are inappropriate):
相同访问密钥在其他Ruby栈(如MRI)可成功上传,涉事代码如下:
require 'aws-sdk' client = Aws::S3::Client.new(region: "asia-south1", credentials: Aws::Credentials.new(access_key,secret_key), endpoint: endpoint, force_path_style: true ) resource = Aws::S3::Resource.new(client: client) bucket = resource.bucket(bucket_name) unique_key = file_name object = bucket.object(unique_key) if File.exists?(path + file_name) object.upload_file(path + file_name) end
可能的原因:
JVM SSL配置限制
JRuby依赖JVM的SSL体系而非Ruby原生OpenSSL,若JVM的java.security配置中禁用了S3要求的TLS版本(如TLS 1.2/1.3)或密码套件,就会触发该错误。而MRI Ruby使用系统/独立OpenSSL,配置逻辑不同,因此能正常连接。可检查JVM配置文件中jdk.tls.disabledAlgorithms项,确认是否存在冲突规则。AWS SDK版本兼容性问题
JRuby环境使用的AWS SDK版本可能与当前JVM环境不兼容,比如旧版本SDK对JVM SSL逻辑处理有缺陷,未适配JVM安全配置。可对比其他Ruby栈的SDK版本,尝试升级或降级到匹配版本。端点协议要求不匹配
若使用自定义S3兼容服务端点,该服务可能要求特定TLS版本或密码套件,JRuby的JVM默认配置无法满足,而MRI的OpenSSL配置刚好符合。可尝试在S3客户端初始化时显式指定SSL参数,比如设置:ssl_cipher_filter或强制指定TLS版本。JVM版本过低
Java 7及以下版本对TLS 1.2支持不完善,而现代S3服务普遍要求至少TLS 1.2。若JRuby运行在低版本JVM上,会出现协议不匹配问题,升级JVM到Java 8及以上版本可解决。
内容的提问来源于stack exchange,提问作者SkotMektominaj

