无法使用除 SSMS 之外的任何东西连接到 SQL Server 2016 SP1

Posted

技术标签:

【中文标题】无法使用除 SSMS 之外的任何东西连接到 SQL Server 2016 SP1【英文标题】:Unable to connect to SQL Server 2016 SP1 with anything except SSMS 【发布时间】:2018-07-12 07:46:49 【问题描述】:

过去 11 个小时我一直在研究它,但我仍然无法弄清楚。它最初是一个 JAVA 连接问题,但此时我能够确认,能够连接到远程 SQL Server 实例的唯一工具是 SQL Server Management Studio。 JDBC 失败,Windows 7 ODBC 失败,Linux 的 DataStage 客户端失败,Visual Studio 2017 数据连接也失败。这是适用于其他服务器的示例 .Net 代码 (C#),但我遇到问题的服务器除外:

    [TestCase(true)]
    [TestCase(false)]
    public void TestMethod(bool encrypt)
    
        var sscsb = new SqlConnectionStringBuilder 
            DataSource = $"server\\instance,port",
            NetworkLibrary = "dbmssocn",
            PacketSize = 4096,
            InitialCatalog = database,
            IntegratedSecurity = false,                
            UserID = user,
            Password = password,
            Encrypt = encrypt,
            TrustServerCertificate = true,                
        ;
        try
        
            using (var conn = new SqlConnection(sscsb.ConnectionString))
            
                conn.Open();
            
            Assert.Pass("Connected");
        
        catch (Exception e)
        
            Assert.Fail(e.Message);
        
    

尝试从这个测试类连接时返回的错误很简单:

Message: Login failed for user 'etldstg'.

在 JAVA 中,取决于 TLS 设置的组合(请注意,登录始终使用自签名证书加密),有时我会得到:

The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "SQL Server did not return a response. The connection has been closed. ClientConnectionId:37dc2f52-c952-4f50-8fc9-62c3bdd84041".

我知道 JAVA 不支持 DHE 密码

Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

此时,我无法要求服务器管理员遵循微软的建议和Disable DHE by registry hacking

所以,我被困住了。有没有人见过类似的东西?你是怎么解决的?

【问题讨论】:

用户 etldstg 在数据库引擎上是否有工作帐户? 是的,正如我所提到的,我可以很好地连接到 SSMS。相同的用户,相同的密码,相同的一切。 SSMS 不使用不同的网络库吗? 也许这个答案适用于您的问题:***.com/a/9001761/44522 不,我也强迫了。只想确认一下。此外,当我查看 JAVA 中的 TLS 调试时,它确实显示正在尝试连接,当我将 TLSv1 用于 sslProtocol.. 【参考方案1】:

首先检查您网络上服务器之间的路由是否打开。

如果是另一个问题,您可以要求管理员查看 SQL Server 实例上的 TCP/IP 协议是否处于活动状态。您可以通过在服务器上打开 SQL Server 配置管理器并检查网络协议来做到这一点。

【讨论】:

这并不能解释为什么 SSMS 可以工作,但其他人不能。感谢您的贡献。 明确一点,我可以连接到服务器正在侦听的端口,所以这不是路由问题。

以上是关于无法使用除 SSMS 之外的任何东西连接到 SQL Server 2016 SP1的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:如何将逗号连接到除最终记录之外的所有文本字段

无法从 SSMS 连接到 AWS 数据库

无法启动T-SQL调试。未能连接到计算器"."。这是在主机名解析时通常出现的暂时错误……

从 SSMS 连接到在容器内运行的 SQL Server Express

无法在桌面应用程序中使用 SqlClient 连接到 SQL Server

使用除 oracle 之外的另一个 linux 用户连接到 sqlplus