当前位置: 首页 > 知识库问答 >
问题:

无法通过使用kerberos票证缓存的apache超文本传输协议客户端4.5进行身份验证

侯焱
2023-03-14

我正在对经过kerberos身份验证的REST服务执行https请求。如果我用的是键盘,一切都很好。但是,我有一个要求,我应该使用kerberos票证缓存文件,该文件是在使用其密码登录工作站时创建的。

我会用我的域名替换域名。组件对象模型

因此,klist显示:

Ticket cache: FILE:/tmp/krb5cc_210007
Default principal: dragomira@MY_DOMAINE.COM

Valid starting     Expires            Service principal
05/15/18 07:21:51  05/15/18 17:21:51  krbtgt/MY_DOMAINE.COM@MY_DOMAINE.COM
        renew until 05/22/18 06:18:22

像这样使用curl工作正常:

curl -k --negotiate -u :  'my_url' -v

现在,让我们回到代码。我的登录。conf是这样的:

com.sun.security.jgss.login {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.accept {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

我的超文本传输协议客户端的相关java代码是:

try {
    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
    HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
    Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
            .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
            .build();
    Credentials dummyCredentials = new NullCredentials();
    CredentialsProvider credProv = new BasicCredentialsProvider();
    credProv.setCredentials(new AuthScope(null, -1, null), dummyCredentials);
    this.httpClient = HttpClientBuilder.create()
            .setDefaultAuthSchemeRegistry(authSchemeRegistry)
            .setDefaultCredentialsProvider(credProv)
            .setSSLContext(sslContext)
            .setSSLHostnameVerifier(hostnameVerifier)
            .build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
    throw new RuntimeException(e.getMessage(), e);
}

在此之前,我设置这些java特性:

java.security.auth.login.config=/home/dragomira/kerberos/login.conf
java.security.krb5.conf=/etc/krb5.conf
sun.security.krb5.debug=true
javax.security.auth.useSubjectCredsOnly=false

kerberos日志的输出为:

从Java配置加载

>>>KinitOptions cache name is /tmp/krb5cc_210007
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is krbtgt/MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 18
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; INITIAL; PRE_AUTH;
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is HTTP/configuration.prd.int.MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 23
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:57:49 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; PRE_AUTH;
>>> unsupported key type found the default TGT: 18

因此,在我看来,这张票是读过的,但没有从中提取凭证,因为我最终收到了401。

为了使用ticket-take,我必须对ApacheHTTP客户端4.5做一些特殊的操作吗?

亲切的问候

共有3个答案

曹泉
2023-03-14

我在spring boot应用程序中也做了同样的事情。我能够使用缓存票证(users/conf/krb5_xyz)进行rest调用,并进行了正确的身份验证。

我的工作客户:

public class Test {

    public static void main(String[] args) {


        Map<String, Object> loginOption = new HashMap<>();
        loginOption.put("refreshKrb5Config","true");
        loginOption.put("useTicketCache", "true");
        loginOption.put("ticketCache","h:/config/krb5cc_xyz");
        loginOption.put("doNotPrompt","true");
        loginOption.put("debug","true");

  /* 
option 1 : using keytab

KerberosRestTemplate restTemplate = new KerberosRestTemplate("C:\\Users\\xyz\\kerberos\\kerberos\\src\\main\\resources\\xyz.keytab", "wdd@sd.sd.sd");*/

/* option 2: using cache */
       KerberosRestTemplate restTemplate = new KerberosRestTemplate(null , "-",loginOption);
        String response = restTemplate.getForObject("http://host:13080/xyz",String.class);
        System.out.println("Result"+response);


    }
杭昊空
2023-03-14

嗯...

默认委托人:dragomira@MY_DOMAINE.COM

调试客户端主体是dragomira@MY_DOMANIN.COM

多曼宁?

令狐运珧
2023-03-14

根据错误:不支持的密钥类型找到了默认的TGT:18

类型18=aes-256-cts-hmac-sha1-96(参见IANA Kerberos参数)

我认为您正在使用具有有限强度JCE策略的JRE,并且必须设置无限强度JCE策略。

在Oracle下载网站上下载Oracle JRE。在附加资源下查看JDK/JRE 8的Java加密扩展(JCE)无限强度权限策略文件

Oracle Java SE下载

另请参阅:OracleJavaSE 8 technote jgss

注意:JDK中的JCE框架包括对加密算法和应用程序可用的最大加密强度实施限制的能力。“管辖权政策文件”中规定了此类限制Java SE中绑定的辖区策略文件限制了最大密钥长度。因此,要使用AES256加密类型,需要安装JCE加密策略的无限版本,以允许AES使用256位密钥。

测试您的策略(来源):

jrunscript -e 'print (javax.crypto.Cipher.getMaxAllowedKeyLength("AES") >= 256);'

从2018年初开始,所有受支持版本的Oracle JDK都将开始提供默认的无限强度JCE策略:

https://bugs.openjdk.java.net/browse/JDK-8189377

还可以看到这些关于反射的有趣解决方法,以及JRE9可能的覆盖设置:https://stackoverflow.com/a/22492582/2824577

 类似资料:
  • 我们最近在 Spark 群集上启用了 Kerberos 身份验证,但我们发现,当我们在群集模式下提交 Spark 作业时,代码无法连接到 Hive。我们是否应该使用 Kerberos 对 Hive 进行身份验证,如果是,如何进行身份验证?如下所述,我认为我们必须指定keytab和校长,但我不知道具体是什么。 这是我们得到的例外: 此外,我看到了这个异常: 这是产生异常的脚本,如您所见,它发生在<

  • 我正在使用一个keytab,并使用windows命令行上的kinit命令设置它。我得到消息“new ticket is storage in cache file”。之后,当我运行java应用程序访问keytab文件以获取密钥时,我得到以下错误。 C:\users\cxxxxx\git\abcd.keytab refreshKrb5Config为false主体为xxxx_dev@xxxx.xxxx

  • 我试图禁用我的AngularJS应用程序中的缓存,但它无法使用以下代码: 当我使用

  • 我正在开发一个Web应用程序,它是rest客户端并使用rest服务(API)来执行任何操作。我集成了apache shiro以使用工作正常的jdbc领域执行身份验证。 现在,我正在寻找一种使用apacheDS LDAP执行身份验证的解决方案。我计划使用kerberos身份验证,但我没有找到任何有用的文章或示例来使用apache shiro实现kerberos身份验证。 我发现apache shir

  • 问题内容: 我需要导入证书,以便向Spring Boot应用程序中的外部服务发出http请求。 我该如何设置Spring Boot来做到这一点? 那里有很多信息,但我发现所有这些都令人困惑。似乎我可能只需要创建类似“ truststore.jks”密钥库的内容并导入正确的证书,然后将一些条目添加到我的application.properties中即可。 问题答案: 打开您的终端或 回答所有问题。在

  • 我有一个.NETWCF客户端与Java服务器组件进行对话。服务器端身份验证通过配置为反向代理的中间Apache服务器完成。 NET客户端的配置如下: Apache配置为需要Kerveros身份验证: 如果我在Windows 7上启动我的应用程序,一切都按预期工作:. NET客户端使用Kerberos,Apache验证客户端,我可以使用Spring Security性访问客户端凭据。 如果我在Win