我必须直接在 Java (J2EE web-app) 中管理 kerberos 用户。如何在有/没有额外库的情况下执行与 kpasswd(或 kadmin)命令等效的操作?我发现了一些商业 API,但它们非常昂贵......
谢谢您的帮助
我必须直接在 Java (J2EE web-app) 中管理 kerberos 用户。如何在有/没有额外库的情况下执行与 kpasswd(或 kadmin)命令等效的操作?我发现了一些商业 API,但它们非常昂贵......
谢谢您的帮助
Kerberos 更改密码协议已在 ApacheDS http://directory.apache.org/中实现。
« 除了 LDAP,它还支持 Kerberos 5 和更改密码协议。»
它使用 Java、开源和免费,就像啤酒一样。
你可以从你的应用程序中调用 kpasswd 吗?
String cmd = "kpasswd -principal foo -passwd bar";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(cmd);
pr.waitFor();
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = "";
while ((line=r.readLine()) != null) {
// TODO process response
}
r.close();
使用 ApacheDS - Maven:
<dependency>
<groupId>org.apache.directory.server</groupId>
<artifactId>kerberos-client</artifactId>
<version>2.0.0-M21</version>
</dependency>
爪哇:
KdcConfig config = KdcConfig.getDefaultConfig();
config.setHostName("ldap.server.cz");
config.setUseUdp(false);
Set<EncryptionType> enct = new HashSet<EncryptionType>();
enct.add(EncryptionType.AES256_CTS_HMAC_SHA1_96);
config.setEncryptionTypes(enct);
KdcConnection conn = new KdcConnection(config);
ChangePasswordResult res = conn.changePassword(userPrincipal, userPassword, "NewPassword");
if (res.getCode().compareTo(ChangePasswordResultCode.KRB5_KPASSWD_SUCCESS) == 0) {
System.out.println("Password was changed!");
} else {
System.out.println("Password change error - " + res.getCode().name());
}
您必须允许端口 464(tcp 或 udp,取决于您使用的协议)。
问题是这总是返回我 KRB5_KPASSWD_MALFORMED :( 错误代码描述 - https://www.ietf.org/proceedings/50/ID/cat-kerberos-set-passwd-04.txt。