com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。
摘要: 在使用exe4j将jar包打包为exe时,出现SSL加密连接SQL Server失败的问题(报错"Could not generate DH keypair")。分析发现原因在于exe运行时未正确加载JRE的加密算法依赖包(sunjce_provider.jar)。虽然本地JRE环境正常,但exe4j配置中仅指定了第三方依赖目录(.\lib)而忽略了JRE的扩展目录(.
问题描述
今天在使用exe4j将jar包打包成exe时,运行exe出现以下报错:
com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)
加密与 SQL Server 建立安全连接。错误:“java.lang.RuntimeException:
Could not generate DH keypair”。
这个问题只在exe中出现,在jar包运行时无异常
原因分析:
出现这个报错究其根本基本上是两种原因,
一是jdk的java.security文件中的jdk.tls.disabledAlgorithms配置项将你使用的算法协议禁止了,导致无法连接初始化,在配置文件中将你使用的协议禁止项去掉即可,这个有许多文章有讲,在此不再赘述了。
二是算法的实现jar包没有找到。Java 的加密算法(包括本人程序报错使用的Diffie-Hellman)依赖于 JRE 自带的扩展 JAR 包:sunjce_provider.jar。这一个jar包缺失可以引申出两个常见原因:1.jdk的版本不支持,在jre下根本没有这个JAR包(本人用的Java1.8.0_181,是支持的)2.exe程序指向的Java运行环境错误,电脑配置的Java运行环境是没问题的,但是指向错了根本找不到依赖的JAR包(本人的问题)
在使用JAR包运行时没有问题,说明我电脑环境配置的JRE是没问题的。exe出问题那么就是在使用exe4j打包时配置依赖的地址指向时有问题,带着这个思路重点检查打包exe时设置的JRE、lib依赖等内容,以下是exe4j中相关的配置:
因为有额外的第三方依赖,所以在VM Parameters参数中添加了-Djava.ext.dirs=“.\lib”,在启动时加载.\lib下的JAR包。原先以为在JRE中设置了jre路径,又设置了.\lib的路径,这两个会同时加载,但实际上因为我的jar包中并没有包含依赖,.\jre下虽然有需要的JAR依赖,但是它只提供运行环境并不提供依赖,而手动添加的VM Parameters参数的.\lib目录下并没有需要的JAR依赖,所以程序找不到需要的依赖。
解决方案:
解决方法就是在VM Parameters参数中手动指定JRE下的依赖目录,即参数如下:
-Djava.ext.dirs=“.\jre\lib\ext;.\lib”
包含了.\jre\lib\ext和.\lib
再次打包exe运行,问题解决
更多推荐
所有评论(0)