java - 在 Java 中使用 Kerberos 密钥表进行 HTTP 调用
问题描述
我正在尝试向受 Kerberos 身份验证保护的 HTTP 端点发出 GET 请求。我能够LoginContext
使用我的 keytab 成功初始化 a ,我可以看到KerberosTicket
正在生成并成功分配给 my Subject
,但由于某种原因,我的 HTTP 请求仍然返回 401 错误。我怀疑票证本身没有附加到 HTTP 请求,但我不确定如何正确启用它。
作为参考,这是我正在运行的代码。我正在使用 Krb5LoginModule:
String keyTab = "~/kerberos.keytab";
String principal = "myself@WEBSITE.COM";
Subject subject = null;
try {
LoginContext context = new LoginContext("", new Subject(), null,
new Configuration() {
@Override
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
Map<String, String> options = new HashMap<String, String>();
options.put("useKeyTab", "true");
options.put("storeKey", "true");
options.put("doNotPrompt", "false");
options.put("useTicketCache", "true");
options.put("isInitiator", "true");
options.put("debug", "true");
options.put("keyTab", keyTab);
options.put("principal", principal);
return new AppConfigurationEntry[]{
new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule",
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
options)};
}
});
context.login(); // Completes successfully. No LoginException thrown.
subject = context.getSubject();
}
catch (LoginException e)
{
e.printStackTrace();
return null;
}
String conn = Subject.doAs(subject, new PrivilegedExceptionAction<String>() {
@Override
public String run() {
URL url = new URL("http://kerberosexample.com");
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
if (con != null) {
int status = con.getResponseCode(); // Returns as 401 Unauthenticated.
// If status is 200, process response body and return as a String.
}
}
});
任何意见是极大的赞赏。
解决方案
指向正确的 krb5.conf。应该做的工作。就像是System.setProperty("java.security.krb5.conf", "krb5.conf");
推荐阅读
- azure - 将 Centos AWS 映像迁移到 Azure VM
- c# - 如何从.net核心实体框架调用具有表值参数的存储过程
- java - 使用带有 List 作为 NamedParameters 的 SpringBatch JdbcCursorItemReader
- mysql - 将新值插入 MySQL 数据库时,键“PRIMARY”的重复条目“111-222”
- python - 从 aspx 页面解析动态生成的 url
- angular - (更改)仅在角 2 中按 enter 后才能工作
- django - django manytomany访问相关列
- sql - 如果没有明确指定,liquibase 如何选择模式?
- ocaml - 如何将模块映射到 OCaml 中的模块类型?
- c# - 如果先前的操作超时,EF SqlQuery 将抛出不支持的 MultipleActiveResultSets 异常