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:
En el directorio raíz de la aplicación, crea una carpeta
.jdk-overlay
Copie la JCE
local_policy.jar
yUS_export_policy.jar
en.jdk-overlay/jre/lib/security/
Confirmar los archivos
$ git add .jdk-overlay
$ git commit -m "Archivos JCE personalizados"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.