java 建立tlsv1.2报错_Java 8上的SQL Server JDBC错误:驱动程序无法通过使用安全套接字层(SSL)加密建立到SQL Server的安全连接...

小编典典

我在Linux实例上的Java 8 JVM中打开了SSL日志记录,从而重现了该问题。使用开启SSL日志记录

-Djavax.net.debug=ssl:handshake:verbose。这揭示了一些有用的信息。

该 解决方法 ,我们在生产中使用,并已被证明对我们的工作是建立在JVM上这个参数:

-Djdk.tls.client.protocols=TLSv1

如果您需要更多详细信息,请继续阅读。

在可以重现问题的服务器上(再次,只有5-10%的时间),我观察到以下内容:

*** ClientHello, TLSv1.2

--- 8

main, WRITE: TLSv1.2 Handshake, length = 195

main, READ: TLSv1.2 Handshake, length = 1130

*** ServerHello, TLSv1.2

--- 8

%% Initialized: [Session-79, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256]

** TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

--- 8

Algorithm: [SHA1withRSA]

--- 8

*** Diffie-Hellman ServerKeyExchange

--- 8

*** ServerHelloDone

*** ClientKeyExchange, DH

--- 8

main, WRITE: TLSv1.2 Handshake, length = 133

--- 8

main, WRITE: TLSv1.2 Change Cipher Spec, length = 1

*** Finished

verify_data: { 108, 116, 29, 115, 13, 26, 154, 198, 17, 125, 114, 166 }

***

main, WRITE: TLSv1.2 Handshake, length = 40

main, called close()

main, called closeInternal(true)

main, SEND TLSv1.2 ALERT: warning, description = close_notify

main, WRITE: TLSv1.2 Alert, length = 26

main, called closeSocket(true)

main, waiting for close_notify or alert: state 5

main, received EOFException: ignored

main, called closeInternal(false)

main, close invoked again; state = 5

main, handling exception: java.io.IOException: SQL Server returned an incomplete response. The connection has been closed. ClientConnectionId:12a722b3-d61d-4ce4-8319-af049a0a4415

请注意, TLSv1.2

由数据库服务器选择并在此交换中使用。我观察到,当有问题的linux服务连接失败时,TLSv1.2始终是所选的级别。但是,使用TLSv1.2时,连接不会总是失败。他们只有5-10%的时间失败。

现在,这里是来自服务器的交换,没有问题。其他一切都是平等的。即,连接到相同的数据库,相同版本的JVM(Java

1.8.0_60),相同的JDBC驱动程序等。请注意,在此情况下,数据库服务器选择的是 TLSv1

,而不是有故障服务器的情况下选择的是TLSv1.2。

*** ClientHello, TLSv1.2

--- 8

main, WRITE: TLSv1.2 Handshake, length = 207

main, READ: TLSv1 Handshake, length = 604

*** ServerHello, TLSv1

--- 8

Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA

--- 8

%% Initialized: [Session-79, TLS_RSA_WITH_AES_128_CBC_SHA]

** TLS_RSA_WITH_AES_128_CBC_SHA

--- 8

Algorithm: [SHA1withRSA]

--- 8

***

*** ServerHelloDone

*** ClientKeyExchange, RSA PreMasterSecret, TLSv1

--- 8

main, WRITE: TLSv1 Handshake, length = 134

main, WRITE: TLSv1 Change Cipher Spec, length = 1

*** Finished

verify_data: { 26, 155, 166, 89, 229, 193, 126, 39, 103, 206, 126, 21 }

***

main, WRITE: TLSv1 Handshake, length = 48

main, READ: TLSv1 Change Cipher Spec, length = 1

main, READ: TLSv1 Handshake, length = 48

*** Finished

因此,当在Linux JVM和SQL Server之间协商TLSv1时,连接总是成功的。协商TLSv1.2时,我们会遇到零星的连接失败。

(注意:Java 7(1.7.0_51)始终协商TLSv1,这就是为什么Java 7 JVM永远不会发生问题的原因。)

我们仍然有未解决的问题:

原因是,从2个不同的Linux服务器运行的同一Java 8 JVM总是会协商TLSv1,但是从另一个Linux服务器连接时,它总是会协商TLSv1.2。

还有为什么TLSv1.2协商的连接在该服务器上大多数(但不是全部)时间都成功?

2020-06-02

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值