最近用一个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包的时候不防去这里找找。
最后,最大家好运!
相关推荐
在SQL Server数据库的使用过程中,有时会出现“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接”的错误,这通常伴随着“Could not generate DH keypair”和“Unsupported curveId:29”的...
当SQLSERVER数据库驱动程序遇到无法通过安全套接字层(SSL)加密与SQL Server建立安全连接的问题时,通常涉及到证书配置、驱动版本兼容性、Java安全策略或者缺少必要的库文件等问题。以下是一些解决此类问题的知识点...
解决jdk1.6连接sqlserver:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。内含readme文档。根据大神源码打包,本人项目使用无问题,如果对你有帮助的话可以给个好评。
在Java编程环境中,图片处理是一项常见的任务,但有时可能会遇到“javax.imageio.IIOException: Unsupported Image Type”的错误。这个异常通常表示Java的`ImageIO`类库无法识别或支持所尝试读取或写入的图像格式。...
完美解决Navicat连接Oracle时提示:“ORA-12737:Instant Client Light:unsupported server character set ZHS16GBK”问题的方法。
java.lang.RuntimeException: Unsupported algorithm: HmacSHA1 解决方法,阿里云
在使用Navacat工具连接Oracle数据库时,可能会遇到“ORA-12737: Instant Client Light: unsupported server character set ZHS16GBK”的错误。这个错误信息表明Navacat在尝试建立连接时,发现Oracle服务器使用的字符...
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 ...
在Oracle数据库环境中,当用户尝试使用oci(Oracle Call Interface)或者sqlplus进行连接时,可能会遇到"ORA-12737"错误。这个错误通常表明客户端与服务器之间的字符集不兼容,具体在这个例子中是"Instant Client ...
然而,有时在使用Navicat连接Oracle数据库时可能会遇到各种问题,如"ORA-12737 InstantClientLight"错误。本文将深入探讨这个错误及其解决方案,同时也会涉及Navicat与Oracle的集成以及InstantClient的相关知识。 ...
解决uiautomatorviewer.bat在android8.0及以上系统报错:“E/Screenshot: Unsupported protocol: 2”
OpenSSL包含了一整套SSL协议的接口,开发人员可以方便地使用这些接口来建立安全套接层,从而实现网络上的安全数据传输。 - **初始化OpenSSL库**:在使用任何OpenSSL函数之前,必须调用`SSL_library_init()`函数来...
为解决 navicat连接oracle报错:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK 错误,而准备的文件
在Java编程环境中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的标准接口。...理解并熟练掌握JDBC连接DB2驱动的使用,对于Java开发者来说是至关重要的,尤其是在开发与数据库交互的应用程序时。
KingbaseV8 JDBC驱动是连接Kingbase数据库管理系统与Java应用程序之间的桥梁,允许Java开发者通过标准的Java Database Connectivity (JDBC) API来访问和操作KingbaseV8数据库。JDBC是Oracle公司提出的用于在Java程序...
FLV流媒体播放器是一种专门设计用于播放FLV(Flash Video)格式的视频文件的应用程序。FLV格式是由Adobe Systems开发的,最初是为了在Flash Player中实现流畅的在线视频流传输。这种格式因其小巧的体积和良好的兼容...
Unsupported File Format(解决方案).md