I/O 错误:SSO 失败:未加载本机 SSPI 库

Posted

技术标签:

【中文标题】I/O 错误:SSO 失败:未加载本机 SSPI 库【英文标题】:I/O Error: SSO Failed: Native SSPI library not loaded 【发布时间】:2012-10-27 09:26:44 【问题描述】:

我正在尝试运行以下代码:

import java.sql.DriverManager;

public class Connect 
    public static void main(String[] args)
        try
            String databaseDriver = "net.sourceforge.jtds.jdbc.Driver";
            Class.forName(databaseDriver);
        
        catch (Exception e) 
            e.printStackTrace();
        

        try
            String url = "jdbc:jtds:sqlserver://BHX:1433/Forecast;instance=SQLEPXRESS";
            java.sql.Connection con = DriverManager.getConnection(url);
            System.out.println("Connection");
        
        catch (Exception e)
            e.printStackTrace();
        
    

我的 SQL 服务器在机器 BHX 的 1433 端口上运行。

我得到的错误信息如下:

java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the     java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:352)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:185)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at Connect.main(Connect.java:14)
Caused by: java.io.IOException: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1893)
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:588)
    ... 6 more

我已经阅读了为什么通常会发生这种情况,并发现了一个类似的问题here,但这似乎不起作用。运行代码时,我包含以下参数来定位 SSO 文件:

-Djava.library.path=/Tester/jdbc/x64/SSO

这是我文件的结构

**Tester**
   *src*
     default package
         Connect.java
   *JRE System Library*
   *jdbc*
     conf
     html
     IA64
     x64
       SSO
        ntlmauth.dll
     x86

你能看出什么不对吗?

【问题讨论】:

文件夹Tester是否位于根文件夹中? Tester 是我在 Eclipse 中创建的 java 项目的名称。它就在我的工作区中。 尝试指定包含ntlmauth.dll的文件夹的绝对路径 我用绝对路径 C:\Users\nos1001\workspace\Tester\jdbc\x64\SSO 尝试过,但我仍然收到相同的消息 【参考方案1】:

似乎和这个问题一样:jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not

您应该将适当的 ntlmauth.dll 文件从 JTDS download package 拖放到您的 JRE bin 文件夹中。

如果您在 64 位 Windows 机器上运行:

这个 32 位 DLL:

下载 >>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

进入这个 32 位 JRE 位置:

C:\Program Files (x86)\Java\jre7\bin

这个 64 位 DLL:

下载 >>> jtds-1.3.0-dist.zip >>> x64 >>> SSO >>> ntlmauth.dll

进入这个 64 位 JRE 位置:

C:\Program Files\Java\jre7\bin

如果您在 32 位 Windows 机器上运行:

这个 32 位 DLL:

下载 >>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

进入这个 32 位 JRE 位置:

C:\Program Files\Java\jre7\bin

如果这不起作用,请尝试在 main 方法的顶部添加这一行: System.out.println(java.lang.System.getProperty('java.library.path'));

它应该输出您的程序正在使用的实际 JRE 路径。确保相应的 ntlmauth.dll 在该 JRE 的 bin 文件夹中。

注意:使用此方法时,请勿设置连接的域、用户或密码属性。

注意:如果您的 Java 客户端程序在非 Windows 机器上运行,那么使用 ntlmauth.dll 方法会很不走运。这是来自 JTDS 下载包中包含的文档的引用:下载 >>> jtds-1.3.0-dist.zip >>> README.SSO

从 0.9.2 版开始,jTDS 能够使用 Windows 客户端程序在其帐户下的当前用户的凭据 运行以登录 SQL Server(Windows 单点登录)。

使用 Windows 单点登录 (SSO) 客户端将能够连接到 不提供凭据的 Microsoft SQL Server。它会动态地 读取当前用户的凭据并连接到数据库。前提是 Windows 帐户在数据库中有足够的权限。这是使用 本机(仅限 Windows)库,ntlmauth.dll。

【讨论】:

非常有用,但是我没有将 ntlmauth.dll 添加到 jre 目录,而是将其添加到 sdk 目录:C:\Program Files\Java\jdk1.7.0_17\bin @Rob.Kachmar 为什么不建议设置域?我只是在设置和不设置的情况下运行它,并且都运行良好。 使用 0xDBE?将 jTDS dist zip 文件中的 x86\SSO\ntlmauth.dll 复制到 C:\Program Files (x86)\JetBrains\0xDBE 139.795.5\jre\jre\bin 我需要将.dll文件复制到C:\Program Files\Java\jdk1.8.0_77\jre\bin 我把这个 dll 放在了上面提到的所有文件夹中,但没有成功。我正在使用 Java 1.7 和 Eclipse Helios 运行 RCP 应用程序。如果我包含用户名和密码,它可以正常工作,但是当我使用 IntegratedSecurity=true 时会出现此错误【参考方案2】:

我遇到了类似的问题,我试图将 ntlmauth.dll 文件放在我认为 sql-developer 会去寻找它的多个目录中。我终于通过将ntlmauth.dll 文件放在sql-developer 应用程序目录本身的\jdk\jre\bin 文件夹中(即sql-developer\jdk\jre\bin)来让它工作。为什么 sql-developer 会在这个文件夹中而不是系统文件夹中查找 ntlmauth.dll,这超出了我的理解水平。无论如何,它奏效了。

下面是我刚刚回答的类似问题的链接。

Oracle SQL Developer connection to Microsoft SQL Server

【讨论】:

请注意,将文件放入此文件夹后,您需要重新启动 Oracle SQL Developer。【参考方案3】:

即使成功将 ntmauth.dll 文件放入 JRE/bin 后,我也会遇到同样的错误。

然后我尝试将ntmauth.dll 放在C:\Windows\System32 目录中。通过这样做,问题得到了解决。

【讨论】:

这个答案最终对我有用,谢谢。此外,我必须使用runas 命令启动 SQL Developer:runas /netonly /user:DOMAIN\User "path-to-sql-developer.exe"【参考方案4】:

未能传递身份验证参数会导致相同的错误,因此除了其他答案之外,您还可以在连接字符串中传递用户名和密码,例如

jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t

【讨论】:

【参考方案5】:

干得好。

但是,部署 JAR 文件时出现了一个小问题!

我建议创建一个文件夹(例如lib)并将所有原生库复制进去。最后添加一个Java执行参数:

java -jar your_jar.jar -Djava.library.path=./lib

这灵感来自 JTDS driver not working for SQL Server 2008R2 and Denali Native SSPI library not loaded

【讨论】:

就我个人而言,我更进一步,在类路径中包含了 lib 文件夹的路径。这有助于确保任何本机库在编译为可执行形式时与应用程序一起使用。【参考方案6】:

我通过将ntlmauth.dll 文件放在\jdk\jre\bin 来让它工作。我使用Tomcat 作为我的应用服务器。

但是,我注意到这一次仅适用于一个部署的 Web 应用程序。如果我对多个 Web 应用程序有相同的设置,那么所有的都失败,但只有一个。这是一种相当奇怪的行为。知道这里发生了什么吗?

【讨论】:

这并没有真正提供问题的答案。要提出新问题,请使用页面顶部的“”按钮。如果它有助于提供上下文,您可以链接到这个问题。

以上是关于I/O 错误:SSO 失败:未加载本机 SSPI 库的主要内容,如果未能解决你的问题,请参考以下文章

具有外部信任的 WCF SSPI 失败 - 选择性与域范围

apns sharp 中的 iPhone 证书错误调用 SSPI 失败

对 SSPI 的调用失败 - 收到的消息是意外的或格式错误

.NET 和 MySQL 错误 - 对 SSPI 的调用失败...“收到的消息意外或格式错误”和“提供给函数的缓冲区太小”

WCF 安全支持提供程序接口 (SSPI) 协商失败

System.Security.Authentication.AuthenticationException:对 SSPI 的调用失败,请参阅内部异常