问题:
达梦数据库开启了应用层通信加密,也就是COMM_ENCRYPT_NAME设置了加密算法,然后manager等java类型的客户端就无法登录了,然disql命令行工具还是可以登录。
直觉告诉我这肯定又是java在作怪,因为命令行工具disql登录是没有问题的呀。我们来解剖一下问题。
进一步测试发现:
COMM_ENCRYPT_NAME设置为“AES128_ECB/AES128_CBC/AES128_CFB/AES128_OFB”的任意一个,用达梦数据库的图形化客户端工具manager去连接登录都没有问题,而设置为“AES192_ECB/AES192_CBC/AES192_CFB/AES192_OFB/AES256_ECB/AES256_CBC/AES256_CFB/AES256_OFB”中的任意一个去登录时,却出现了“6061:通信加密协商失败”的错误。
发现错误,我们第一时间要看报错日志。
在dmdbms/log/tool.log日志文件里的“通信加密协商失败”附近发现了详细而又核心的报错信息:
“Caused by: java.security.InvalidKeyException: Illegal key size or default parameters ”
将这个关键信息键入百度,度娘告诉我们应该去这里找答案:
通过学习这个博客,我们知道了问题就是美国的出口限制,限制高安全的产品对外出口,因为老美有制度C1级(D1<C2<C1<B3<B2<B1<A)以上安全级的信息安全产品是不能对外出口的。
简而言之,就是SUN公司遵循漂亮国的信息安全产品出国规章制度,只能出口低安全级别的信息安全产品,而AES192/AES256算法是密钥长度达到192位/256位的算法,属于高安全算法,它在漂亮国的制度里是不可以出口的。AES128是低安全级别的算法,可以出口给漂亮国以外的国家使用。这个问题是SUN公司(现在叫做Oracle公司)的JDK引入的,只要修改它的设置或用其他的JDK来替换它,就可以解决。
问题知道了我们怎么去解决呢?
解决办法1:继续用Oracle公司的JDK,但是替换两个jar文件以去掉这个出口限制。
- 下载jce:
JDK7的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html |
将local_policy.jar和US_export_policy.jar两个文件替换到dmdbms/jdk/jre/lib/security/下对应的文件。
“java -version”查出来是1.8版本的JDK就下载“JDK8的下载地址”中的文件去替换,查出来是 1.7版本的JDK就下载“JDK7的下载地址”中的文件去替换.
替换之后重现启动数据库服务、重新启动manager图形化工具,即可。
解决办法2:用OpenJDK来替换Oracle公司的JDK。
将dmdbms下的jdk文件夹备份成jdk-oracle文件夹,然后将openjdk文件夹拷入到dmdbms下,重命名为jdk文件夹,然后用“java -version”查看到版本信息里有“openJDK”字样,再重新启动manager程序去登录。
需要注意的是截图上是64位的1.8版本的OpenJDK,替换64位的1.8版本的JDK,不能拿32位的1.8版本去替换,如果拿32位的jdk替换后客户端工具会打不开。
解决办法3:将manager使用的JDK指向到你机器上其他的JDK。
打开manager.ini文件,将-vm下的“../jdk/bin”替换成你机器上其他JDK的路径,如:“D:\Java\OpenJDK1.8_x64\bin”
保存文档后,重新打开manager再试。
如果你觉得这篇文章对你有益,解决了你的问题,记得打赏哦