R Shiny连接数据库出现java.lang.RuntimeException: Illegal key size报错求助
问题解决:java.security.InvalidKeyException: Illegal key size
这个报错的核心原因是Java默认的加密密钥长度限制——JCE(Java Cryptography Extension)默认只允许128位以内的加密密钥,当你的数据库连接用到了更长的密钥(比如AES-256)时,就会触发这个错误。你在RStudio Server里能正常运行,说明RStudio使用的Java环境已经解除了这个限制,但Shiny Server或root终端使用的Java环境没有配置对应的无限制政策文件。
解决步骤:
确认目标Java环境路径
- 以root身份在终端执行:
记录输出的Java版本和安装路径(比如java -version which java/usr/lib/jvm/java-8-openjdk-amd64/) - 对于Shiny Server,可在你的Shiny应用代码中临时添加一行:
重启Shiny Server后查看日志,获取它使用的Java环境路径print(Sys.getenv("JAVA_HOME"))
- 以root身份在终端执行:
获取对应版本的JCE无限制政策文件
- Java 8及以下:需要手动下载「JCE Unlimited Strength Jurisdiction Policy Files」(注意匹配你的Java主版本)
- Java 9及以上:默认已经移除了密钥长度限制,若仍报错,检查是否是定制版JRE保留了限制,可跳过手动下载,直接看下一步验证
替换JCE政策文件
- 进入Java环境的
lib/security目录,比如:cd /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security - 备份原有文件:
cp local_policy.jar local_policy.jar.bak cp US_export_policy.jar US_export_policy.jar.bak - 将下载的无限制政策文件中的
local_policy.jar和US_export_policy.jar复制到该目录 - 设置正确的文件权限:
chmod 644 local_policy.jar US_export_policy.jar chown root:root local_policy.jar US_export_policy.jar
- 进入Java环境的
验证修复效果
- 以root身份重新在终端运行你的R脚本,检查数据库连接是否正常
- 重启Shiny Server:
再通过sudo systemctl restart shiny-server10....:3838/app1访问应用测试
额外排查点:
- 如果你使用
RJDBC或rJava包,确认它们绑定的Java环境和你修改的是同一个(可通过rJava::.jinit()查看) - 检查Shiny Server的运行用户(默认是
shiny)是否有读取JCE政策文件的权限
内容的提问来源于stack exchange,提问作者Mário Lopes
相关产品推荐
相关产品推荐

