SSLContext.getInstance()中参数设置TLS版本无效的问题

问题:SSLContext sc = SSLContext.getInstance(“TLSv1.1”)设置后,https握手连接使用中使用的TLS版本还是jdk的默认版本(jdk7默认是TLSv1,jdk8默认是TLSv1.2)。
原因:代码中有这个段conn.getOutputStream().write(postBody.toString().getBytes());// 输入参数 进行输入参数,而SSLContext sc = SSLContext.getInstance(“TLSv1.1”)放在conn.getOutputStream().write(postBody.toString().getBytes())代码的后面,导致设置的TLSv1.1不生效。
解决办法:将SSLContext.getInstance(“TLSv1.1”)放到conn.getOutputStream().write(postBody.toString().getBytes())的前面即可。
以下在jdk8环境下的测试:
这样设置不生效
![
在这里插入图片描述
这样设置才生效
在这里插入图片描述
在这里插入图片描述
具体·的原因是因为在conn.getOutputStream()获取输出流的过程中,conn就已经做了conn.connect()方法了,一条连接已经建立了,后面再进行SSLContext sc = SSLContext.getInstance(“TLSv1.1”);指定TLS的版本自然就不会生效了。
在这里插入图片描述
这仅仅是我个人的理解,不一定对,仅供大家参考。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java.security path: D:\biayu\jdk\jre\lib\security Security providers: [SUN version 1.8, SunRsaSign version 1.8, SunEC version 1.8, SunJSSE version 1.8, SunJCE version 1.8, SunJGSS version 1.8, SunSASL version 1.8, XMLDSig version 1.8, SunPCSC version 1.8, SunMSCAPI version 1.8] SSLContext provider info: Sun JSSE provider(PKCS12, SunX509/PKIX key/trust factories, SSLv3/TLSv1/TLSv1.1/TLSv1.2/TLSv1.3) SSLContext provider services: [SunJSSE: KeyPairGenerator.RSA -> sun.security.rsa.RSAKeyPairGenerator$Legacy aliases: [OID.1.2.840.113549.1.1, 1.2.840.113549.1.1, 1.2.840.113549.1.1.1] , SunJSSE: KeyFactory.RSA -> sun.security.rsa.RSAKeyFactory$Legacy aliases: [OID.1.2.840.113549.1.1, 1.2.840.113549.1.1, 1.2.840.113549.1.1.1] , SunJSSE: Signature.SHA1withRSA -> sun.security.rsa.RSASignature$SHA1withRSA aliases: [OID.1.2.840.113549.1.1.5, 1.2.840.113549.1.1.5, 1.3.14.3.2.29] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey} , SunJSSE: SSLContext.TLS -> sun.security.ssl.SSLContextImpl$TLSContext aliases: [SSL] , SunJSSE: SSLContext.TLSv1 -> sun.security.ssl.SSLContextImpl$TLS10Context aliases: [SSLv3] , SunJSSE: Signature.MD2withRSA -> sun.security.rsa.RSASignature$MD2withRSA aliases: [OID.1.2.840.113549.1.1.2, 1.2.840.113549.1.1.2] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey} , SunJSSE: Signature.MD5withRSA -> sun.security.rsa.RSASignature$MD5withRSA aliases: [OID.1.2.840.113549.1.1.4, 1.2.840.113549.1.1.4] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey} , SunJSSE: KeyStore.PKCS12 -> sun.security.pkcs12.PKCS12KeyStore , SunJSSE: TrustManagerFactory.SunX509 -> sun.security.ssl.TrustManagerFactoryImpl$SimpleFactory , SunJSSE: KeyManagerFactory.SunX509 -> sun.security.ssl.KeyManagerFactoryImpl$SunX509 , SunJSSE: TrustManagerFactory.PKIX -> sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory aliases: [SunPKIX, X509, X.509] , SunJSSE: KeyManagerFactory.NewSunX509 -> sun.security.ssl.KeyManagerFactoryImpl$X509 aliases: [PKIX] , SunJSSE: SSLContext.Default -> sun.security.ssl.SSLContextImpl$DefaultSSLContext , SunJSSE: SSLContext.TLSv1.1 -> sun.security.ssl.SSLContextImpl$TLS11Context , SunJSSE: Signature.MD5andSHA1withRSA -> sun.security.ssl.RSASignature , SunJSSE: SSLContext.TLSv1.3 -> sun.security.ssl.SSLContextImpl$TLS13Context , SunJSSE: SSLContext.TLSv1.2 -> sun.security.ssl.SSLContextImpl$TLS12Context ] java.ext.dirs: D:\biayu\jdk\jre\lib\ext;C:\Windows\Sun\Java\lib\ext 2023-07-14 09:02:08.895 ERROR 6772 --- [ main] com.zaxxer.hikari.pool.HikariPool : master - Exception during pool initialization. com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 ClientConnectionId:275886a9-fcb1-451b-af33-3b3ea3195ee6
07-15
根据你提供的信息,错误提示是:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误信息显示客户端偏好的协议版本为 [TLS13, TLS12],而服务器选择的协议版本TLS10。这导致连接失败。 要解决这个问题,你可以尝试以下方法: 1. 检查 SQL Server 的 SSL/TLS 配置:确保 SQL Server 配置的 SSL/TLS 协议版本与客户端兼容。你可以在 SQL Server 配置管理器的 "SQL Server Network Configuration" 下的 "Protocols for [InstanceName]" 检查和配置 SSL/TLS 设置。 2. 更新 JDBC 驱动程序:尝试更新使用的 JDBC 驱动程序版本,以确保它支持客户端偏好的协议版本。你可以从 Microsoft 官方网站下载最新的 JDBC 驱动程序。 3. 更新 Java 运行时环境 (JRE):确保你使用的 Java 运行时环境 (JRE) 版本支持所需的 SSL/TLS 协议版本。你可以尝试升级到最新的 Java 版本。 4. 显式设置 SSLContext:在连接 SQL Server 之前,通过代码显式设置 SSLContext,指定所需的 SSL/TLS 协议版本。例如,可以使用以下代码片段设置TLSv1.2 版本: ```java SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, null); ``` 然后,将该 SSLContext 传递给 SQL Server 连接的属性。 请注意,具体的解决方法可能因你的环境和需求而有所不同。建议先尝试这些方法,并根据实际情况进行调整和进一步研究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值