【问题标题】:Connection problem Linux Apache+PHP to MS SQL Server using WindowsAuth / Kerberos ("No Kerberos credentials available")使用 WindowsAuth/Kerberos 的 Linux Apache+PHP 到 MS SQL Server 的连接问题(“没有可用的 Kerberos 凭据”)
【发布时间】:2019-08-08 00:05:55
【问题描述】:

以下设置:我有一台 Linux (Debian) 机器作为网络服务器 (apache) 和 Windows 上的 MS SQL Server。此外,我无法为此获取 SQL 用户,只能通过 AD/Windows Auth 进行身份验证。

我正在使用按照 Microsoft 的说明安装的 Microsoft ODBC 驱动程序和 sqlsrv 扩展。

我使用主体名称和密码成功运行kinit。 现在,在使用sqlcmd 或什至在使用 sqlsrv_connect 以交互模式 (php -a) 使用 PHP 时,与 MSSQL Server 的基于 Windows-Auth 的连接可以完美运行,但是当我尝试通过 Apache 从 php 文件运行简单示例连接时,它不起作用。我收到这样的错误消息:

Array ( [0] => Array ( [0] => HY000 [SQLSTATE] => HY000 [1] => 851968 [code] => 851968 [2] => [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_33) [message] => [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_33) ) [1] => Array ( [0] => HY000 [SQLSTATE] => HY000 [1] => 851968 [code] => 851968 [2] => [Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context [message] => [Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context ) )

我知道附加 _XX 的缓存代表 UID,所以我认为这可能是我已经尝试过不同用户请求票证之类的问题,但我无法让它工作。

我还尝试使用 unixODBC 并定义一个 DSN。它在使用 isql 进行测试并在 php 交互模式下使用 odbc_connect 时工作(也与使用 pyodbc 的 python 一起),但不是来自 php 页面。

有人知道我缺少什么吗?这可能很明显,但我对这个主题相当陌生,并且没有太多关于从 linux 机器访问基于 Windows 的 MS SQL 服务器而无需额外 SQL 用户的信息。提前感谢您的帮助!

【问题讨论】:

    标签: php sql-server windows-authentication sqlsrv msodbcsql17


    【解决方案1】:

    自己找到了答案,本来可以早点想出来的,但我会把这个留在这里,以防其他人偶然发现这个问题:

    我已经认为它与访问权限/权限有关,因为它基本上可以在除 Apache 之外的任何地方工作,但我不知道为什么,直到我发现这是由 systemd 引起的:

    Systemd 有一个名为 SecureTmp 的功能,可以防止服务访问/tmp。如here 所述为 Apache 停用此功能以进行测试解决了该问题。我现在将了解如何以不同的方式执行此操作,因为我不想禁用此功能。希望这对某人有帮助:-)

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,并且在使用 sqlcmdphp -a 进行测试时也可以正常工作。但是,我的错误消息没有包含如上所示的默认缓存文件:

      Array
      (
          [0] => Array
              (
                  [0] => HY000
                  [SQLSTATE] => HY000
                  [1] => 851968
                  [code] => 851968
                  [2] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available
                  [message] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available
              )
      
          [1] => Array
              (
                  [0] => HY000
                  [SQLSTATE] => HY000
                  [1] => 851968
                  [code] => 851968
                  [2] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context
                  [message] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context
              )
      )
      

      解决方案是添加一个环境变量,将 KRB5CCNAME 设置为凭据缓存的路径。如果使用 PHP-FPM,请相应地编辑它并添加到您的池配置文件中:

      env[KRB5CCNAME] = FILE:/tmp/krb5cc_UID
      

      或者,在/etc/krb5.conf 中设置default_ccache_name 属性:

      [libdefaults]
          default_ccache_name = FILE:/tmp/krb5cc_%{uid}
      

      Reference

      【讨论】:

        【解决方案3】:

        我使用配置文件中的用户名和密码解决了这个问题,在我的例子中是 Laravel 应用程序中的“.env”。我在 MSSql 数据库中创建了用户,它工作了!

        DB_CONNECTION=sqlsrv
        DB_HOST=1.1.1.1\DESENVOLVIMENTO 
        DB_PORT=
        DB_DATABASE=v3
        DB_USERNAME=Fran
        DB_PASSWORD=1234;

        【讨论】:

          猜你喜欢
          • 2010-10-07
          • 1970-01-01
          • 2021-05-24
          • 1970-01-01
          • 2015-04-20
          • 1970-01-01
          • 2019-05-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多