为什么Java中的kerberos身份验证不支持直接IP访问或主机别名访问

为什么Java中的kerberos身份验证不支持直接IP访问或主机别名访问,java,iis,kerberos,negotiate,Java,Iis,Kerberos,Negotiate,我的计算机(Windows,JDK7 update 21 x64),如mybox.domain2.company.com,已连接到我公司的一个域。我可以通过三种不同的URL访问站点: http://mysite.domain1.company.com 或 或 通过IE、Firefox等的协商认证,这里domain1.company.com和domain2.company.com是我公司的两个域名。此站点位于IIS 7中,其身份验证为“协商” 在谷歌搜索和配置kerberos之后,我可以使用ja

我的计算机(Windows,JDK7 update 21 x64),如mybox.domain2.company.com,已连接到我公司的一个域。我可以通过三种不同的URL访问站点:

http://mysite.domain1.company.com

通过IE、Firefox等的协商认证,这里domain1.company.com和domain2.company.com是我公司的两个域名。此站点位于IIS 7中,其身份验证为“协商”

在谷歌搜索和配置kerberos之后,我可以使用java中的URLConnection来访问

http://mysite.domain1.company.com
。不过,我可以在浏览器中使用IP或主机别名来实现这一点,但在Java中则不行。任何人都可以实现直接IP访问或主机别名访问吗

krb5.conf:

[libdefaults]
    default_realm = DOMAIN2.COMPANY.COM
    default_tkt_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    default_tgs_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crc
[domain_realm]
    .domain1.company.com = DOMAIN1.COMPANY.COM
    .domain2.company.com = DOMAIN2.COMPANY.COM
login.conf:

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required;
};

(请注意,所有的主机名都只给出了一个例子。)

Kerberos不是设计用于IP地址的。只使用主机名。

这可能是真的,但是1。浏览器可以通过IIS协商访问页面。我想知道浏览器如何处理这个问题。2.即使不支持IP,域别名又如何?仅仅因为它是可协商的。如果Kerberos失败,浏览器将退回到NTLM。我还认为可能会有一些退步。但我认为我正确地处理了NTLM(只能访问其他NTLM站点),但我们讨论的站点无法触发代码中的NTLM身份验证部分。因此,如果我们能够正确地处理这个问题,问题就会得到解决。谢谢你的指导。您能提供一些关于如何回退并在Java中处理此问题的进一步信息吗?我想更清楚地描述它:Windows Java 7中内置了对URL类的ntlm支持,并且我使用jcifs for Apache HttpClient处理了ntlm。如果您通过配置了kerberos的ip或域别名访问协商站点,则这些都不起作用。所以我需要一个解决方法。为什么不直接使用FQDN,问题就解决了呢?请记住,NTLM是专有的,没有开源实现可能与MS的实现相匹配。Java 8支持NTLM,Apache HttpClient似乎也支持NTLM。如果服务器需要协商,则客户端必须在不需要您干预的情况下自动执行回退,但JDK只支持带Kerberos的SPNEGO,不支持NTLM。
[libdefaults]
    default_realm = DOMAIN2.COMPANY.COM
    default_tkt_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    default_tgs_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crc
[domain_realm]
    .domain1.company.com = DOMAIN1.COMPANY.COM
    .domain2.company.com = DOMAIN2.COMPANY.COM
com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required;
};