我是通过 kerberos 协议(protocol)进行身份验证的新手,因此我尝试阅读大量有关它的方法,但似乎我找不到任何与我的限制相关的细节。这是我所拥有的:
- 用户在其上进行身份验证以登录其工作站的 Active Directory 服务器
- 每个最终用户都使用 IE 7 连接到我的 Intranet 应用程序
- 具有负载平衡功能的 Apache 服务器
- 一些 Tomcats 服务器充当 Apache 服务器的工作人员。
- 在每个 tomcat 上,我运行 2 个 jakarta servlet,用户仅连接一个 servlet(此外,我将其称为 servlet,就好像只有一个一样)
- 我的tomcat需要在jdk5下运行。不是jdk6或jdk4。现在是jdk5时期。
现在我想要一个自动登录我的 servlet。基本上我只需要我的 servlet 来检索客户端的主体,然后我就可以管理其余的了。 根据我的理解,我的客户有一张票,他向 KDC 请求一张用于访问 apache 服务器的特殊票,然后他尝试连接到 Apache 服务器。然后,apache 服务器根据他的 key 表解码身份验证数据并授予/拒绝对指定资源的访问。 我对吗?请指导我完成此操作,我已经阅读了 4 天的页面,但仍然不知道哪种解决方案更合适。我尝试了 Apache 的 mod_auth_kerberos,但他没有获取用户的票证,而是像基本身份验证一样询问它。显然是spgneo
谢谢
最佳答案
好的,我成功了:
- 安装 Kerberos 5 + apache 2 + mod_auth_kerb。
- 在您的 AD 上,生成一个 key 表,其中仅包含您将用于 Apache 的主体,我使用 HTTP/[email protected]
- 将此 keytab 文件放在您的 apache 服务器上并使其只读 由您的 Apache 用户提供。
- 然后使用这些指令编辑您的 apacheconf 以确保您的安全 位置
apache.conf:
[…]
ServerName apache.mydom.com:80
[…]
LoadModule auth_kerb_module modules/mod_auth_kerb.so
[…]
<LocationMatch /secure)>
[… some other stuff …]
Order allow,deny
Allow from all
AuthType Kerberos
AuthName "Authentification requise"
KrbAuthRealms MYDOM.COM
#this allows user to be saved in the request
KrbSaveCredentials on
#this one force Negotiate AuthType instead of basic fallback
KrbMethodNegotiate on
#this trim the realm from username saved in the request (request.getRemoteUser() will give you "user" instead of "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1164627463515c48555e5c3f525e5c" rel="noreferrer noopener nofollow">[email protected]</a>"
KrbLocalUserMapping on
KrbAuthoritative on
KrbVerifyKDC on
Krb5Keytab /install/binaries/httpd/apache.keytab
KrbServiceName HTTP
require valid-user
</LocationMatch>
我在网上几乎找不到的一件事是,你必须修改你的 tomcat 服务器配置(tomcat/conf/server.xml):
<Connector [... AJP connector configuration ...] request.tomcatAuthentication="false"/>
这非常重要,因为没有它,tomcat 将无法从 tomcat auth 检索任何信息。 也不要忘记,DNS 对于 Kerberos 安装非常非常非常重要。如果您有任何问题,请尝试检查所有服务器的 DNS。
关于java - JDK5 下使用 Apache 和 Tomcat 的 Kerberos SSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448558/