簡體   English   中英

Java中的簡單Kerberos客戶端?

[英]Simple Kerberos client in Java?

谷歌的Chrome和IE等應用程序可以透明地處理Kerberos身份驗證; 但是,我無法找到一個“簡單”的Java解決方案來匹配這種透明度。 我發現的所有解決方案都需要存在krb5.conf文件和login.conf文件,而上述應用程序似乎需要這些文件。

使用Kerberos SSO功能構建Java應用程序的最佳方法是什么?

[更新]:要明確我需要一個CLIENT端解決方案來創建不驗證它們的票證 此外,似乎SPNEGO是默認的“包裝器”協議,最終將委托給Kerberos,但我也需要能夠處理SPNEGO協議。

現在有一個使用Apache HTTP Components Client 4.5或更高版本的簡單解決方案。 這在4.5中仍然標記為實驗性,因此您的milage可能會有所不同,但在企業環境中這對我來說很好。

除了HC 4.5客戶端jar之外,您還需要在類路徑中使用httpclient-win,jna和jna-platform jar,如http-component-client所提供。 然后,您構建一個啟用Kerberos的HC客戶端,如下所示:

CloseableHttpClient httpclient = WinHttpClients.createDefault();

或者使用構建器:

HttpClientBuilder clientBuilder = WinHttpClients.custom();

然后可以在構建客戶端之前根據需要對其進行自定義:

CloseableHttpClient client = clientBuilder.build();

此解決方案無需任何外部配置即可運行,最重要的是解決了內置JRE機制在Windows 7+上具有本地管理員權限的用戶中斷的問題。 這是可能的,因為Kerberos票證是通過JNA直接從SSPI API檢索的,而不是通過JRE提供的GSSAPI。

來自http-components團隊的示例代碼

Daniel Doubrovkine Timothy WallRyan McKinley的出色工作使這一切成為可能

添加到David Roussels關於url特定基於http的kerberos身份驗證的答案: -

您的代碼工作的原因是因為您的目標SPN(服務器端主體)配置為HTTP /serverhostname.realm.com@DOMAIN.COM。 在這種情況下,它將起作用,因為您沒有明確設置令牌。 URLConnection在內部使用該SPN設置令牌

1執行步驟(來自我之前的答案)以獲得主題

2使用gss api init sec context生成上下文令牌。 這一步有很多教程

3 Base 64編碼令牌

4將令牌附加到urlconnection: -

URL url = new URL("http://myhost/myapp")
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); = 
urlConn.setRequestProperty("Authorization", "Negotiate " + encodedToken);

5實施特權行動: -

//this internally calls the getInputStream
public class PrivilegedGetInputStream implements PrivilegedExceptionAction<InputStream>

6將整個東西包裹在Subject.doAs中

//use prev answer instructions to get subject
Subject.doAs(subject, new PrivilegedGetInputStream(urlConnection)

Oracle有一個使用Java的SaslClient的例子 我不是一名Java程序員,但是當我向某個人指出這一點時,他們能夠很快地使它工作。 它可能仍然需要某處的“conf”文件(nb Kerberos使用環境變量,通常以KRB5_開頭,以了解在哪里查找此類文件)。 另請注意,Kerberos本身不包含任何類型的傳輸 - 您的應用程序需要知道如何以服務器期望的方式發送和接收Kerberos有效負載(這取決於您嘗試進行身份驗證的服務器)。

編輯:你編輯了你的問題,所以這里有一個與Java中的SPNEGO相關的鏈接,可能有一些用處: http//download.oracle.com/javase/6/docs/technotes/guides/security/jgss/lab/part5 html的

你實際上不需要做任何事情。 在Java 6中,在Windows客戶端計算機上,您可以執行以下操作:

new URL("http://myhost/myapp").openStream();

協商身份驗證才有效。 至少它對我有用。 我測試的服務器只支持Negotiate,而不支持NTLM auth。

好的,如果你想避免使用login.conf文件,你需要采用不同的代碼: -

//define your own configuration
import javax.security.auth.login.Configuration;
public class CustomLoginConfiguration extends Configuration

//pass certain parameters to its constructor
//define an config entry
import javax.security.auth.login.AppConfigurationEntry;
private AppConfigurationEntry configEntry;

//define a map of params you wish to pass and fill them up
//the map contains entries similar to one you have in login.conf
Map<String, String> params = new HashMap<String, String>();

//define the configuration
configEntry = new AppConfigurationEntry(
            "com.sun.security.auth.module.Krb5LoginModule",
            AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, params);

//implement getappconfig method
public AppConfigurationEntry[] getAppConfigurationEntry() {
    return new AppConfigurationEntry[] { configEntry };
}

現在,一旦完成了這個定義,你可以使用它來使用它從kdc中獲取票證

//get ticket in login context
LoginContext lc = null;
    lc = new LoginContext("lc", null, callback, new CustomLoginConfiguration(argumentlist));
    lc.login();

現在從這里你可以獲取jaas主題,基本上可以做大量的身份驗證。

如果您需要進一步的指示,請發表評論。

您可以使用系統屬性而不是配置文件來指定KDC主機名和服務名稱,但這些(至​​少)是強制性的....

Waffle實際上會為您提供設置大部分房產所需的信息,即使它不會給您帶票。 查看WindowsAuthProviderImpl類(Waffle.chm幫助文件顯示API)。

我使用JAAS通過兩個步驟從Active Directory獲取服務票證:

  1. 使用Krb5LoginModule檢索緩存的TGT並將其添加到Subject。

  2. 使用Subject和GSS-API從KDC檢索服務票證。

The Java Way of Active Directory中有很多好的信息和示例代碼。

我創建了一個小工具來簡化與httpclient與kerberos的連接,你可能想嘗試一下。 https://github.com/DovAmir/httpclientAuthHelper

DefaultHttpClient httpclient = new DefaultHttpClient();
AuthUtils.securityLogging(SecurityLogType.KERBEROS,true);
CredentialsUtils.setKerberosCredentials(client, new UsernamePasswordCredentials("xxx", "xxx"), "domain", "kdc");
client.executeMethod(httpget);

這是一篇關於讓一個java客戶端與Kerberos一起使用的好文章http://sachithdhanushka.blogspot.com/2014/02/kerberos-java-client-configuration.html

使用WAFFLE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM