your you the supported rails not how have deploy declared available heroku openssl jruby ruby-on-rails-4

heroku - you - OpenSSL:: Cipher:: CipherError con Rails4 en JRuby



ruby on rails heroku (3)

El Centro Heroku Dev ahora tiene este artículo: "Personalizar el JDK" .

En algunos casos, los archivos deben agruparse con el JDK para exponer la funcionalidad en la JVM de tiempo de ejecución. Por ejemplo, la inclusión de extensiones criptográficas Java (JCE) de fuerza ilimitada a menudo se agrega a un JDK para utilizar bibliotecas criptográficas más potentes. Para manejar estos casos, Heroku copiará los archivos designados por la aplicación en una carpeta .jdk-overlay en la estructura de directorios del JDK.

A continuación, le mostramos cómo agregar archivos JCE a su aplicación:

  1. En el directorio raíz de la aplicación, crea una carpeta .jdk-overlay

  2. Copie la JCE local_policy.jar y US_export_policy.jar en .jdk-overlay/jre/lib/security/

  3. Confirmar los archivos

    $ git add .jdk-overlay
    $ git commit -m "Archivos JCE personalizados"

  4. Implementar a Heroku

    $ git push heroku master

Rails4 usa una tienda de sesiones de cookies cifradas de manera predeterminada. Cuando la aplicación intenta encriptar una cookie aparece el siguiente error: 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 ).

Como se mencionó here esto puede solucionarse degradando la criptografía o instalando JCE: la primera es algo que realmente no quiero hacer y la última es imposible (afaik) en heroku.


No estoy seguro de si funcionará en Heroku, pero esto resuelve el problema en mi Jruby local.

Crear 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


Usando el enfoque de , esto resolvió mi problema en producción, pero rompió dev sin el rescate.

# 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

Es porque diferentes javas tienen flavas diferentes ... ... me dejaré salir.