最近用一个SSH的项目去连接一个2012版本的SQL Server,Tomcat一启动就报这个错误:
com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“Unsupported curveId: 29”。
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368)
at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1412)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1058)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:833)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:716)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:841)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
Caused by: javax.net.ssl.SSLHandshakeException: Unsupported curveId: 29
at com.sun.net.ssl.internal.ssl.HandshakeMessage$ECDH_ServerKeyExchange.<init>(HandshakeMessage.java:905)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:198)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:943)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1379)
... 7 more
先说一下我这边的基本情况:一个使用1.6版本64位的jdk的SSH项目访问本地的2005的SQL Server数据库一切正常,访问局域网中其他一个2012版本的SQL Server数据库报以上的错,2012数据库所在服务器SQL Server允许远程连接,我本地的防火墙也已经关闭了。服务器的防火墙也关了。我的系统是win7 64位的。
单单就“Unsupported curveId: 29”的问题,去百度上搜。比较少,且基本是有问无答或者答非所问的。所以,这一块儿也没找到结果。
另一方面,单单就“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接”的问题,百度上一搜一大把,但解决方案无外乎两种:一种是添加bcprov-ext-jdk15on-1.54的jar包然后改一下配置文件,一种是换JDK版本的。我不想修改JDK的版本(目前是1.6,需要换到1.7或更高),因为改了之后很多项目都会报乱七八糟的错误解决起来也很麻烦;至于添加jar包的路子,我添加了jar包也改了配置文件依旧没有效果。
后来问同事他们的项目是否可以正常连接,他们说可以,问配置了什么,他们说就是把SQL Server2005的驱动删了只保留了sqljdbc4的驱动,别的就没有了。我也照旧的删了,还是报错。
后来是搜了很多乱七八糟的方法都没有效果,最后再这一篇误打误撞解决了。这一篇中说要换jdk,我没有换。说要添加jar包如下:
在jdk1.8.0_101\jre\lib\security\java.security文件添加一行
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider,前面的数字递增。
按照这个说明添加了,最后问题解决了。
为了弄明白到底是哪个配置根本性解决了问题,我把原来的配置一个一个删除了,一个一个试,结果发现就是jdk安装目录\jre\lib\ext少了sunjce_provider.jar包导致的。为了验证这个,还特意查了好几位同事的jdk,他们的jdk同目录下都有这个文件,唯独我的没有。至此算是彻底明白这个问题的根源所在了。
最后总结一下我认为对解决这个问题有用的方法:
1、确保用户名、密码、驱动、URL都对,不要有多余的空格,URL中的数据库链接正确,数据库使用URL中的地址能远程访问(用IP地址的确保用IP地址能直接访问),双方的防火墙是否关闭或者是否设置了允许程序通过。
2、使用C3P0连接数据库的,查一下连接数是否够用,可以参考这篇进行查看。
3、将tomat地下的work目录下的文件全部删除,避免临时文件、缓存文件的影响
4、确保项目里边只有一个能连接较高版本SQL Server的驱动包(不但要删除项目下的,还要删除tomcat的lib目录下的,确保只是用那一个jar包)
5、查看jdk安装目录\jre\lib\ext是否少了sunjce_provider.jar这个jar包
以上5个方法仅仅针对于我上面提及的情况,因为我用同样的代码去连接外部网络中一台同为12版本的SQL Server却依旧报这个错,目前还没有找到解决办法。有解决的烦请告知,谢谢!
转载一个类似问题的解决方法:解决java连接SQLSERVER数据库之驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:Could not generate DH keypair”
转载链接:http://blog.csdn.net/cw_hello1/article/details/51740893
/**************转载内容开始*******************************************************************/
这个问题是JDK与数据库之间的安全密钥的问题:
我的系统是64位的,以前在32位机器上没有出现这个问题:
程序一连接数据库就会报com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“java.lang.RuntimeException: Could not generate DH keypair”。这样的错误。
JDK采用1.6就会报这个错误,采用1.7就不会报这个错误。
最后使用1.6终于解决了:
方案就是:
1.下载两个jar包
1.bcprov-ext-jdk15on-1.54.jar
2.bcprov-jdk15on-1.54.jar
下载地址在:http://download.csdn.net/detail/cw_hello1/9557049
2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program Files (x86)\java\JDK1.6\jre\lib\ext
3.打开java.security文件:在JDK安装目录\jre\lib\security下的java.security文件。
找到security.provider.1=sun.security.provider.Sun换成
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
重新执行连接数据库程序就可以。
/**************转载内容结束********************************************************************************/
声明:
1、原帖下的评论有的说解决了问题有的说没解决,因为我没有碰到这个问题所以没有测试是否可行,这里只是转载一下以后可能会用到。
2、有些说还需要添加mchange-commons-java-0.2.3.4.jar包才能解决。
3、转载内容中虽说有两个jar包的连接,但是是CSDN上的且需要积分,有账号有积分的随便下,没积分的可以去一下链接去下,也可以去附件中下。
bcprov-ext-jdk15on-1.54.jar:http://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk15on/1.54
bcprov-jdk15on-1.54.jar:http://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.54
下载方法有两种,如图:
一种是“点击中间红框中的jar会弹出保存框”,一种是复制底下文本域中的内容放到maven项目的pom.xml中让maven自动去下。
这个网站的jar包挺多也挺全的,而且免费,大家找不到jar包的时候不防去这里找找。
最后,最大家好运!
相关推荐
用于解决SQLSERVER连接问题驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接问题JAR包。
解决Could not generate DH keypair 和 Unsupported curveId :29问题
NULL 博文链接:https://zhangmingji.iteye.com/blog/1969693
java.lang.RuntimeException: Unsupported algorithm: HmacSHA1 解决方法,阿里云
32位和64位 java6 连接sqlserver2012或者2016 出现 Caused by: javax.net.ssl.SSLHandshakeException: Unsupported curveId: 29 以及 DH key size must be multiple of 64, and can only range from 512 to 1024 ...
我们用Navacat连接Oracle数据库的时候,会提示ORA-12737:Instant Client Light:unsupported server character set ZHS16GBK
SSL是一种在客户端和服务器端之间建立安全通道的协议。SSL一经提出,就在Internet上得到...OpenSSL包含一套SSL协议的完整接口,应用程序应用它们可以很方便的建立起安全套接层,进而能够通过网络进行安全的数据传输。
解决uiautomatorviewer.bat在android8.0及以上系统报错:“E/Screenshot: Unsupported protocol: 2”
为解决 navicat连接oracle报错:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK 错误,而准备的文件
1.Navicat OCI引⽤位置可以从Navicat菜单栏“⼯具”-》“选项”-》环境-》“OCI”中找到 2.Navicat替换的⽂件
flv流媒体播放器 可以播放flv格式的视频文件
新建 genesis.json在文件夹genesis中, 写入: { config: { chainId: 666, homesteadBlock: 0, eip150Block: 0, eip150Hash: 0x0000000000000000000000000000000000000000000000000000000000000000, ...
js控制的flv播放器,附带实例,可以直接不是,带播放列表字幕
QT运行时需要有此动态库,放到和应用程序一级的地方即可加载QMYSQL的驱动,QT运行时需要有这个动态库,放到和应用程序一级的地方即可加载QMYSQL的驱动。如果libmysql.dll太老,可能会出现以下错误 Using unsupported...
three.js加载gltf模型的完整demo,使用vue开发的,比较简单,便于理解
26.2.0.jar 包,解决 (1) E/Screenshot: Unsupported protocol: 2 (2) Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 导致的 uiautomatorviewer 无法获取截屏问题
gaussDB驱动
如何通过DB2连接远程服务器端的数据库。db2远程连接数据库
Traceback (most recent call last): File "C:/Users/Lenovo/PycharmProjects/untitled3/text6.py", line 49, in printGoodsList(infoList) 序号 价格 商品名称 File "C:/Users/Lenovo/PycharmProjects/...