`

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“Unsupported curveId: 29”。

阅读更多

最近用一个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包如下:

http://blog.csdn.net/shersfy/article/details/52448799 写道
确保…\jdk1.8.0_101\jre\lib\ext目录下存在sunjce_provider.jar,不存在从jre下面的\lib\ext拷贝
在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包的时候不防去这里找找。

 

最后,最大家好运!

  • 大小: 48.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics