Rails 7中如何将RSA 2048密钥对存入环境凭证?
Rails凭证存储RSA密钥后JWE解密失败的原因与解决方法
问题原因
你从Rails多环境凭证中取出的是纯字符串格式的RSA密钥,但ruby-jwe的JWE.decrypt方法要求传入的是OpenSSL::PKey::RSA实例对象,而非普通字符串。
控制台测试时你应该是直接通过OpenSSL::PKey::RSA.new加载了密钥对象,所以能正常加密解密;但将密钥字符串存入凭证后,取出的内容只是原始文本,不具备RSA密钥对象的方法(比如private_decrypt),因此触发错误。
解决方法
取出密钥字符串后,需要手动将其转换为OpenSSL::PKey::RSA对象:
# 从凭证取出密钥字符串 private_key_str = Rails.application.credentials.rsa_key # 转换为RSA密钥对象 private_key = OpenSSL::PKey::RSA.new(private_key_str) # 正常调用解密方法 JWE.decrypt(your_encrypted_data, private_key)
如果你的RSA密钥设置了密码,转换时需要传入密码参数:
private_key = OpenSSL::PKey::RSA.new(private_key_str, "your_key_password")
优化建议
可以把密钥转换逻辑封装成全局辅助方法,避免重复代码。比如在config/initializers/jwe.rb中添加:
def jwe_private_key @jwe_private_key ||= OpenSSL::PKey::RSA.new(Rails.application.credentials.rsa_key) end
之后在代码中直接调用jwe_private_key即可获取可用的RSA密钥对象。
内容的提问来源于stack exchange,提问作者tajfun_88
相关产品推荐
相关产品推荐

