如何解决驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。

背景:

就写个简单的jdbc连接sqlserver数据库,用的是最新的JDK 24版本。

结果代码运行出现以下错误

数据库连接失败!

com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:"No appropriate protocol (protocol is disabled or cipher suites are inappropriate)"。 ClientConnectionId:0f49ebb2-c949-49f7-acb6-c07929c83cd3

at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:3806)

at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1906)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:3329)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2950)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2790)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1663)

at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1064)

at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:613)

at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:199)

at com.kaka.dao.SQLServerJDBC.main(SQLServerJDBC.java:27)

Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

at java.base/sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:162)

at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:103)

at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:245)

at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:448)

at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)

at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1795)

... 8 more

解决方案:

1、找到java安装目录的conf\security

2、用记事本软件打开java.security文件,找到第737行,或者直接搜索关键字jdk.tls.disabledAlgorithms=SSLv3,如下所示,把红框的删除掉,然后保存文件。

3、再次运行代码

复制代码
package com.kaka.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class SQLServerJDBC {
    
    // 数据库连接信息
    private static final String URL = "jdbc:sqlserver://127.0.0.1:1433;databaseName=Test-demo;encrypt=true;trustServerCertificate=true;sslProtocol=TLSv1";
    private static final String USERNAME = "sa";
    private static final String PASSWORD = "123456";
    
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            // 1. 加载驱动(JDBC 4.0+ 可以自动加载,这一步可选)
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            
            // 2. 建立连接
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            System.out.println("数据库连接成功!");
            
            // 3. 创建Statement对象
            statement = connection.createStatement();
            
            // 4. 执行查询
            String sql = "SELECT * FROM UserInfo";
            resultSet = statement.executeQuery(sql);
            
            // 5. 处理结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
            
        } catch (ClassNotFoundException e) {
            System.err.println("找不到JDBC驱动!");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("数据库连接失败!");
            e.printStackTrace();
        } finally {
            // 6. 关闭资源
            try {
                if (resultSet != null) resultSet.close();
                if (statement != null) statement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

4、运行结果

相关推荐
Hello.Reader5 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
wdfk_prog5 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
盟接之桥5 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
数据与后端架构提升之路6 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
忆~遂愿6 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘6 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
Fcy6487 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满7 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法