使用 WindowsAuth / Kerberos ("No Kerberos credentials available") 到 MS SQL 服务器的连接问题 Linux Apache+PHP
Connection problem Linux Apache+PHP to MS SQL Server using WindowsAuth / Kerberos ("No Kerberos credentials available")
以下设置:我有一台 Linux (Debian) 机器作为网络服务器 (apache) 和一台 Windows 上的 MS SQL 服务器。此外,我无法为此获得 SQL 用户,只能通过 AD/Windows Auth.
进行身份验证
我正在使用我按照 Microsoft 的说明安装的 Microsoft ODBC 驱动程序和 sqlsrv 扩展。
I 运行 kinit
使用主体名称和密码成功。
现在,基于 Windows-Auth 的到 MSSQL 服务器的连接在使用 sqlcmd
或什至在交互模式下使用 PHP 时(php -a
)使用 sqlsrv_connect,但是当我尝试通过 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.It 在使用 isql
进行测试并在 php 交互模式下使用 odbc_connect
(也使用 python 使用 pyodbc),但不是来自 php 页面。
有人知道我遗漏了什么吗?这可能很明显,但我对这个话题还很陌生,没有太多关于从 linux 机器访问基于 Windows 的 MS SQL 服务器的内容额外 SQL 用户。提前感谢您的帮助!
我自己找到了答案,本来可以早点想出来的,但我会把它留在这里以防其他人偶然发现这个问题:
我已经认为它与访问 rights/permissions 有关,因为它基本上可以在 Apache 以外的任何地方工作,但我无法弄清楚为什么,直到我发现这是由 systemd 引起的:
Systemd 具有防止服务访问 /tmp
的功能,称为 SecureTmp。按照 here 所述为 Apache 停用此功能以进行测试解决了该问题。我现在将了解如何以不同的方式执行此操作,因为我不想禁用此功能。希望这对某人有帮助:-)
我遇到了类似的问题,在使用 sqlcmd
和 php -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}
我用配置文件中的用户名和密码解决了这个问题,在我的例子中是 Laravel 应用程序中的“.env”。我在 MSSql 数据库中创建了用户,它成功了!
DB_CONNECTION=sqlsrv
DB_HOST=1.1.1.1\DESENVOLVIMENTO
DB_PORT=
DB_DATABASE=v3
DB_USERNAME=Fran
DB_PASSWORD=1234;
以下设置:我有一台 Linux (Debian) 机器作为网络服务器 (apache) 和一台 Windows 上的 MS SQL 服务器。此外,我无法为此获得 SQL 用户,只能通过 AD/Windows Auth.
进行身份验证我正在使用我按照 Microsoft 的说明安装的 Microsoft ODBC 驱动程序和 sqlsrv 扩展。
I 运行 kinit
使用主体名称和密码成功。
现在,基于 Windows-Auth 的到 MSSQL 服务器的连接在使用 sqlcmd
或什至在交互模式下使用 PHP 时(php -a
)使用 sqlsrv_connect,但是当我尝试通过 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.It 在使用 isql
进行测试并在 php 交互模式下使用 odbc_connect
(也使用 python 使用 pyodbc),但不是来自 php 页面。
有人知道我遗漏了什么吗?这可能很明显,但我对这个话题还很陌生,没有太多关于从 linux 机器访问基于 Windows 的 MS SQL 服务器的内容额外 SQL 用户。提前感谢您的帮助!
我自己找到了答案,本来可以早点想出来的,但我会把它留在这里以防其他人偶然发现这个问题:
我已经认为它与访问 rights/permissions 有关,因为它基本上可以在 Apache 以外的任何地方工作,但我无法弄清楚为什么,直到我发现这是由 systemd 引起的:
Systemd 具有防止服务访问 /tmp
的功能,称为 SecureTmp。按照 here 所述为 Apache 停用此功能以进行测试解决了该问题。我现在将了解如何以不同的方式执行此操作,因为我不想禁用此功能。希望这对某人有帮助:-)
我遇到了类似的问题,在使用 sqlcmd
和 php -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}
我用配置文件中的用户名和密码解决了这个问题,在我的例子中是 Laravel 应用程序中的“.env”。我在 MSSql 数据库中创建了用户,它成功了!
DB_CONNECTION=sqlsrv
DB_HOST=1.1.1.1\DESENVOLVIMENTO
DB_PORT=
DB_DATABASE=v3
DB_USERNAME=Fran
DB_PASSWORD=1234;