我正在通过运行在 Apache 上的网站(SLES 11.1 上的 Apache2)为 Active Directory 用户设置 SSO,使用 Firefox 测试时一切正常。但当我尝试在 Internet Explorer 8(Windows 7)中打开该网站时,我得到的只是
“错误的请求
您的浏览器发送了一个该服务器无法理解的请求。
请求标头字段的大小超出服务器限制。
授权:协商[超长字符串]”
我的 vhost.cfg 如下所示:
<VirtualHost hostname:443>
LimitRequestFieldSize 32760
LimitRequestLine 32760
LogLevel debug
<Directory "/data/pwtool/sec-data/adbauth">
AuthName "Please login with your AD-credentials (Windows Account)"
AuthType Kerberos
KrbMethodNegotiate on
KrbAuthRealms REALM.TLD
KrbServiceName HTTP/hostname
Krb5Keytab /data/pwtool/conf/http_hostname.krb5.keytab
KrbMethodK5Passwd on
KrbLocalUserMapping on
Order allow,deny
Allow from all
</Directory>
<Directory "/data/pwtool/sec-data/adbauth">
Require valid-user
</Directory>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/apache2/ssl.crt/hostname-server.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/hostname-server.key
</VirtualHost>
我还确保删除了 cookie,并尝试了 LimitRequestFieldSize 和 LimitRequestLine 的几个较小的值。
另一件我觉得很奇怪的事情是,即使使用 LogLevel debug,我也不会收到有关此问题的任何日志。日志的最后一行是
ssl_engine_kernel.c(1879): OpenSSL: Write: SSL negotiation finished successfully
有人对此有想法吗?
答案1
我的直觉告诉我,您有一个非常大的安全令牌,可能是因为该用户是大量组的成员。AD Kerberos 实现将为 Apache 提供特权属性证书(PAC)。如果用户是大量组的成员,此结构可能会很大。您可以使用tokensz.exe
工具查看用户的令牌大小。
如果这是问题,你可以修改用户帐户的 UserAccountControl 属性以防止 PAC 被发送。
您可能能够通过修改/etc/krb5.conf
文件来引用 KDC kdc = tcp/kdc.name.here
。如果 PAC 导致令牌对于 UDP 数据报来说太大,则可能会发生此问题,但强制使用 TCP 与 KDC 通信也是一种可行的解决方法。
如果这能解决您的问题,那么更改 1,000 个用户的该值对于您的 AD 管理员来说并不困难。
答案2
我找到了另一个解决方案,但我不确定它是否真的有效。Apache Docs 指出,对于大包,我必须设置 LimitRequestFieldSize 和/或 LimitRequestLine 。
问题是,如果你想将 LimitRequestLine 的值设置为高于 8KB 的任何值,那么你必须修改源代码并重新编译 Apache,因为 8KB 是固定的 maxSize(http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestline)。
我不确定这种方法是否有效,因为我后来在第二台服务器上从我们自己的存储库重新安装了 apache。看来这是一个不同的软件包版本,因为问题没有在那里发生。
答案3
我在 Mac 上的 Safari 中的 Drupal 7 网站上遇到了这个错误,我发现关闭浏览器窗口并清除浏览器缓存,退出浏览器,重新打开浏览器并重新加载页面可以停止错误,这种错误只发生过一次。
错误请求 您的浏览器发送了一个该服务器无法理解的请求。> 请求标头字段的大小超出服务器限制。Cookie /n
答案4
如果有人遇到 mod_proxy_ajp 的这个问题,请查看:从哪个 Apache 版本开始 LimitRequestFieldSize 不再硬编码为最大 8k?