Rails应用执行JWT.encode触发OpenSSL::HMACError内存分配失败求助
问题描述
执行JWT.encode时部分测试失败,报错信息:
/Users/chille/.rbenv/versions/3.1.1/lib/ruby/3.1.0/openssl/hmac.rb:36:in `initialize': EVP_PKEY_new_mac_key: malloc failure (OpenSSL::HMACError)
已尝试操作:
- 重新安装Ruby 3.1.1
- 切换至Ruby 3兼容的OpenSSL@3版本
问题仍未解决。
环境信息
MAC OS Monterrey 12.6.1Ruby 3.1.1Rails 7
可能的解决方向
检查JWT密钥合法性
确认签名用的密钥格式、长度符合算法要求。比如HMAC类算法(如HS256)要求密钥非空,HS256至少需要32字节(256位)的密钥,若密钥过短、为空或格式错误,可能触发底层OpenSSL的内存分配异常。验证Ruby与OpenSSL绑定一致性
运行ruby -r openssl -e 'puts OpenSSL::OPENSSL_VERSION'确认Ruby实际调用的OpenSSL版本,对比系统安装的版本是否匹配。若存在差异,重新通过rbenv编译Ruby并指定正确的OpenSSL路径:RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)" rbenv install 3.1.1排查测试用例特殊场景
针对部分测试失败的情况,检查失败用例的JWT生成逻辑:是否存在循环批量生成JWT、动态生成异常密钥、并发测试导致资源竞争等场景。单独运行失败用例,添加日志输出密钥内容,确认输入参数是否异常。更新JWT gem版本
旧版jwt gem可能存在与Ruby 3.1/OpenSSL 3的兼容bug,尝试更新至最新稳定版:bundle update jwt检查系统资源与OpenSSL配置
错误提示malloc失败,可能是测试运行时系统内存不足,或是OpenSSL配置存在限制。关闭其他高内存占用应用后重新运行测试,也可检查OpenSSL配置文件(如/usr/local/etc/openssl@3/openssl.cnf)是否有异常设置。
内容的提问来源于stack exchange,提问作者Denis Omerovic

