我正在开发一个rails应用程序,我遇到了一个奇怪的错误,我不知道如何修复它。我的一些测试在运行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,还重新安装了OpenSSL以使用opensssl@3版本,因为该版本与ruby 3兼容,但没有成功。
如果有人知道如何解决这个问题,我将不胜感激。
MAC OS Monterrey 12.6.1
Ruby 3.1.1
Rails 7
我认为这是OpenSSL 1.1和现在的OpenSSL 3(Ruby 3已经迁移到OpenSSL 3(之间的兼容性问题。像ruby-jwt
这样的宝石正在解决这些兼容性问题:https://github.com/jwt/ruby-jwt/issues/495
据推测,JWT v2.5.0版本增加了对OpenSSL的支持>=3.0版本,如果JWT正确支持OpenSSL 3.0,则该版本的干净安装(或升级(如果您不在该版本上(应该可以解决问题。
--编辑--
更新:事实上,看起来他们承认这是中的一个错误https://github.com/jwt/ruby-jwt/issues/526此后,它在Ruby的OpenSSL和JWT中得到了修复,但仅在大约两周前,所以到目前为止还没有新的版本。
--在我们等待修复的时候
同时,如果你不直接需要OpenSSL 3,你可以使用OpenSSL 1.1 重建你的ruby
假设你已经通过自制软件安装了openssl@1.1
,并使用asdf来管理你的Ruby版本(尽管这个env选项适用于任何使用Ruby构建的东西(:
RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)" asdf install ruby 3.1.1
我也遇到了同样的问题。这是两者之间的兼容性问题OpenSSL@1.1和OpenSSL@3.0.7在ruby 3.1.0及以上版本上。所以我通过以下步骤修复:
- 卸载ruby 3.1.1
- 转到.rbenv/plugins/ruby build/share/ruby-build/3.1.1
在里面,这个文件你有安装包openssl@3.0.7和ruby@3.1.1
install_package "openssl-3.0.7" "https://www.openssl.org/source/openssl-3.0.7.tar.gz#83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e" openssl --if needs_openssl_102_300
install_package "ruby-3.1.1" "https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.1.tar.gz#fe6e4782de97443978ddba8ba4be38d222aa24dc3e3f02a6a8e7701c0eeb619d" ldflags_dirs enable_shared standard verify_openssl
现在,将第1行更改为openssl@1.1包装:
install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" openssl --if needs_openssl_101_111
之后,更改.rbenv/plugins/ruby build/share/ruby-build/3.1.1文件中的行。使用中的以下安装说明安装ruby 3.1.1版https://github.com/rbenv/rbenv#installing-ruby版本。用途:
rbenv install 3.1.1 --verbose
你会看到openssl@1.1正在安装,并将解决此问题。
更多信息,请关注我的媒体文章:ruby 上的openssl hmaceror