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.jarUS_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的主要内容,如果未能解决你的问题,请参考以下文章