在JRuby上使用Rails4的OpenSSL :: Cipher :: CipherError

时间:2013-01-27 21:06:33

标签: heroku openssl jruby ruby-on-rails-4

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(stacktrace:https://gist.github.com/8ba56b18060ae30e4d44)。

正如前面提到的here这可以通过降级加密或安装JCE来解决 - 第一个是我不想做的事情,后者在heroku上是不可能的(afaik)。

3 个答案:

答案 0 :(得分:18)

不确定它是否适用于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: #{e}n"
  end
end

答案 1 :(得分:3)

Heroku开发中心现在有这篇文章:"Customizing the JDK"

  

在某些情况下,需要将文件与JDK捆绑在一起,以便在运行时JVM中公开功能。例如,为了利用更强大的加密库,通常会在JDK中添加无限强度的Java Cryptography Extensions(JCE)。为了处理这种情况,Heroku会将应用程序在.jdk-overlay文件夹中指定的文件复制到JDK的目录结构中。

以下是如何将JCE文件添加到您的应用中:

  1. 在应用程序的根目录中,创建一个.jdk-overlay文件夹

  2. 将JCE local_policy.jarUS_export_policy.jar复制到.jdk-overlay/jre/lib/security/

  3. 提交文件

      

    $ git add .jdk-overlay
      $ git commit -m“自定义JCE文件”

  4. 部署到Heroku

      

    $ git push heroku master

答案 2 :(得分:1)

使用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

这是因为不同的javas有不同的flavas ......我会让自己出去。