OpenSSL::Cipher::CipherError 在 JRuby 上使用 Rails4
Posted
技术标签:
【中文标题】OpenSSL::Cipher::CipherError 在 JRuby 上使用 Rails4【英文标题】:OpenSSL::Cipher::CipherError with Rails4 on JRuby 【发布时间】:2013-01-11 05:12:33 【问题描述】:Rails4 默认使用加密的 cookie 会话存储。当应用尝试加密 cookie 时,会引发以下错误:OpenSSL::Cipher::CipherError: Illegal key size: possibly you need to install Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for your JRE
(堆栈跟踪:https://gist.github.com/8ba56b18060ae30e4d44)。
正如here 提到的,这可以通过降级加密或安装 JCE 来解决 - 第一个是我真的不想做的事情,而后者在 heroku 上是不可能的(afaik)。
【问题讨论】:
也遇到了这个问题。你能想出办法吗? 也看到了这个问题 @Mark 现在有一篇关于如何在 heroku 上修复 JCE 的文章 - 看看这个答案是否有帮助。 @GregoryOstermayr 现在有一篇关于如何在 heroku 上修复 JCE 的文章 - 看看这个答案是否有帮助。 【参考方案1】:不确定它是否适用于 Heroku,但 this resolves the issue 在我当地的 Jruby 上。
创建 config/initializers/unlimited_strength_cryptography.rb:
if RUBY_PLATFORM == 'java' # Allows the application to work with other Rubies if not JRuby
require 'java'
java_import 'java.lang.ClassNotFoundException'
begin
security_class = java.lang.Class.for_name('javax.crypto.JceSecurity')
restricted_field = security_class.get_declared_field('isRestricted')
restricted_field.accessible = true
restricted_field.set nil, false
rescue ClassNotFoundException => e
# Handle Mac Java, etc not having this configuration setting
$stderr.print "Java told me: #en"
end
end
【讨论】:
我在 Mac Java 中遇到了一些 ClassNotFound 异常。要解决这个问题,请像在这篇文章中一样包含 begin/rescue/end:lorenzod8n.wordpress.com/2007/05/24/… 此外,如果 Gemfile 中包含gem 'jruby-openssl'
,则可以跳过 JCE 的安装。【参考方案2】:
Heroku 开发中心现在有这篇文章:"Customizing the JDK"。
在某些情况下,需要将文件与 JDK 捆绑在一起,以便在运行时 JVM 中公开功能。例如,为了利用更强大的加密库,通常会在 JDK 中添加无限强度的 Java 加密扩展 (JCE)。为了处理这种情况,Heroku 会将 .jdk-overlay 文件夹中应用指定的文件复制到 JDK 的目录结构中。
以下是将 JCE 文件添加到您的应用的方法:
在应用程序的根目录中,创建一个.jdk-overlay
文件夹
将 JCE local_policy.jar
和 US_export_policy.jar
复制到 .jdk-overlay/jre/lib/security/
提交文件
$ git add .jdk-overlay $ git commit -m "自定义 JCE 文件"
部署到 Heroku
$ git push heroku master
【讨论】:
【参考方案3】:使用Leons' 方法,这解决了我在生产中的问题,但在没有救援的情况下破坏了开发。
# config/initializers/unrestricted_crypto.rb
begin # Enable 'restricted' cipher libraries on crippled systems
prop = Java::JavaxCrypto::JceSecurity.get_declared_field 'isRestricted'
prop.accessible = true
prop.set nil, false
rescue NameError
end
因为不同的java有不同的flavas... ...我会放过自己的。
【讨论】:
以上是关于OpenSSL::Cipher::CipherError 在 JRuby 上使用 Rails4的主要内容,如果未能解决你的问题,请参考以下文章