由于SSL问题,无法使用JDBC(基于连接字符串和示例提供)连接到Azure

时间:2016-11-29 23:48:47

标签: java sql-server azure ssl jdbc

我收到以下错误:com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法使用安全套接字层(SSL)加密建立与SQL Server的安全连接。错误:"通过对等方重置连接:套接字写入错误。"

import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;

public class SQLDatabaseConnection {

    // Connect to your database.
    // Replace server name, username, and password with your credentials
    public static void main(String[] args) {
        String connectionString =
                "jdbc:sqlserver://XXXXX.database.windows.net:1433;"
                        + "database=VDB;"
                        + "user=XXX@VVV;"
                        + "password=XXXX;"
                        + "encrypt=true;"
                        + "trustServerCertificate=false;"
                        + "hostNameInCertificate=*.database.windows.net;"
                        + "loginTimeout=30;";

        // Declare the JDBC objects.
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
         //   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            connection = DriverManager.getConnection(connectionString);

            // Create and execute a SELECT SQL statement.
            String selectSql = "SELECT TOP 2 * from Application";
            statement = connection.createStatement();
            resultSet = statement.executeQuery(selectSql);

            // Print results from select statement
            while (resultSet.next()) {
                System.out.println(resultSet.getString(2) + " "
                        + resultSet.getString(3));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // Close the connections after the data has been handled.
            if (resultSet != null) try {
                resultSet.close();
                } catch (Exception e) {
            }
            if (statement != null) try {
                statement.close();
            } catch (Exception e) {
            }
            if (connection != null) try {
            connection.close();
            } catch (Exception e) {
            }
        }
    }
}

我只是想做"示例" Azure站点上引用的代码连接片段(指向MS条目),仅修改为匹配我的数据库和测试表但没有成功。

经过审查后我知道,我有: -

  1. 确保我使用正确的sqljdbc(我已尝试全部4个)
  2. 在CLASSPATH上有sqlauth.dll
  3. 如图所示,将样本完全设置为;并整合了Azure提供的字符串。
  4. 我尝试了加密和信任的各种组合而没有成功。由于我是Java和Azure的新手,我不愿意并且不确定如何摆弄JVM安全设置。

    我已经证明我的计算机可以与Azure数据库通信(通过VB ODBC连接);我已经用防火墙测试了。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我尝试重现该问题,但未能使用与您类似的代码访问我的SQL Azure实例。

除了使用我的sql azure实例的连接字符串之外,我们的代码之间的差异如下所示。

  1. 使用sqljdbc4.jar link
  2. 中的驱动程序sqljdbc_4.0
  3. 使用代码Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");加载MS SQL JDBC驱动程序。
  4. 未将sqlauth.dll文件添加到CLASSPATH
  5. 检查SQL Azure IP防火墙允许的客户端IP。
  6. 使用sql select 1+1测试我的代码,并从代码4获取值result.getInt(1)
  7. 这对我来说很好。如果您可以为我们提供更多信息,我认为这对分析问题非常有帮助。

    希望它有所帮助。