Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 到SQL server的Kerberos连接是否需要在连接属性中提供密码?_Sql Server_Kerberos - Fatal编程技术网

Sql server 到SQL server的Kerberos连接是否需要在连接属性中提供密码?

Sql server 到SQL server的Kerberos连接是否需要在连接属性中提供密码?,sql-server,kerberos,Sql Server,Kerberos,我正试图使用keytab连接到sql server,它抛出以下错误 com.microsoft.sqlserver.jdbc.SQLServerException:无法使用Kerberos主体域\用户登录,请检查您的凭据。Kerberos登录失败:集成身份验证失败。ClientConnectionId:6f436f49-b0bf-441e-bab3-e6af86ac8361由于javax.security.auth.login.LoginException(无法从con属性获取任何属性:[密码,

我正试图使用keytab连接到sql server,它抛出以下错误

com.microsoft.sqlserver.jdbc.SQLServerException:无法使用Kerberos主体域\用户登录,请检查您的凭据。Kerberos登录失败:集成身份验证失败。ClientConnectionId:6f436f49-b0bf-441e-bab3-e6af86ac8361由于javax.security.auth.login.LoginException(无法从con属性获取任何属性:[密码,密码],无法从用户获取身份验证信息) 位于com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit(KerbAuthentication.java:108) 位于com.microsoft.sqlserver.jdbc.KerbAuthentication.GenerateClientContext(KerbAuthentication.java:399) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4049) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3157) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:82) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3121) 位于com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2478) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2026) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1687) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.connectioninternal(SQLServerConnection.java:1528) 位于com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:866) 位于com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:569) 位于java.sql.DriverManager.getConnection(未知源) 位于java.sql.DriverManager.getConnection(未知源) 位于com.advennet.appmanager.server.mssql.datacollection.MSSQLKerberosAuthenticationTest.main(MSSQLKerberosAuthenticationTest.java:47) 原因:javax.security.auth.login.login异常:无法从con属性获取任何属性:[password,password],无法从用户获取身份验证信息 位于com.sun.security.auth.module.Krb5LoginModule.promptForPass(未知源) 位于com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(未知源) 位于com.sun.security.auth.module.Krb5LoginModule.login(未知源) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源) 在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源) 位于java.lang.reflect.Method.invoke(未知源) 位于javax.security.auth.login.LoginContext.invoke(未知源) 位于javax.security.auth.login.LoginContext.access$000(未知源) 位于javax.security.auth.login.LoginContext$4.run(未知源) 位于javax.security.auth.login.LoginContext$4.run(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于javax.security.auth.login.LoginContext.invokePriv(未知源代码) 位于javax.security.auth.login.LoginContext.login(未知源) 位于com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit(KerbAuthentication.java:87) ... 还有15个

当我尝试使用密码时,它已成功连接

String home = System.getProperty("user.dir");
String  filePath = home + File.separator + "conf" + File.separator + "KerberosConfigurations" + File.separator + "MSSQL";// NO I18N
System.setProperty("java.security.krb5.debug", "true");
System.setProperty("java.security.auth.login.config", filePath+File.separator+"login.conf");
System.setProperty("java.security.krb5.conf", filePath+File.separator+"krb5.ini");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
String connectionUrl = "jdbc:sqlserver://"+hostName+":"+port+";databaseName=master;sendStringParametersAsUnicode=true;applicationName=test;"; //NO I18N
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Properties dbConProp = new Properties();
dbConProp.put("integratedSecurity", "true");
dbConProp.put("authenticationScheme", "JavaKerberos");
dbConProp.put("instanceName",instanceName);
dbConProp.put("user",user);
//dbConProp.put("password",pwd);
con = DriverManager.getConnection(connectionUrl,dbConProp);

连接属性中的密码对于kerberos连接是必需的吗?仅使用Keytab还不够?

客户端需要首先通过域的身份验证。e、 g.在使用的Linux和MacOS上,您可以使用
kinit
命令获取kerberos票证

一旦获得授权,您就可以通过该票证对Sql进行身份验证,而无需提供任何其他内容

[更新]

如果您的主机和目标都在Windows域上,并且它们在同一个域上,那么您应该已经准备好了

也就是说,如果运行引擎的服务帐户具有创建SPN的权限(或者具有适当权限的用户使用
setSPN
命令创建了SPN),Sql将仅允许您使用Kerberos进行身份验证

通过查看Sql错误日志中的文本,您可以判断Sql是否能够注册SPN

SQL Server网络接口库已成功为SQL Server服务注册服务主体名称(SPN)[MSSQLSvc/MySqlServerHostName:1433]


Kerberos有很多内容,而不仅仅是StackOverflow的答案。

如果您使用Kerboros,则不提供用户名或密码;连接使用应用程序正在运行的已验证Windows帐户的凭据。感谢您的回复。您能告诉我什么时候提供钥匙扣吗?我指的是这些配置System.setProperty(“java.security.krb5.debug”,“true”);System.setProperty(“java.security.auth.login.config”,filePath+File.separator+“login.conf”);setProperty(“java.security.krb5.conf”,filePath+File.separator+“krb5.ini”);System.setProperty(“javax.security.auth.UseSubjectCredOnly”、“false”);您没有指定操作系统,因此我在Windows中找到了一些东西:谢谢您。是的,是windows。。但我的疑问是,只要抛出kinit,不使用keytab,我们就可以连接到SQL server吗?是的,如果您的keytab生成正确的话。我给你的页面上有生成键的完整说明,谢谢你的回复。我的问题是,如果不使用keytab,我们可以通过抛出kinit命令连接到sqlserver吗。