我可以在Java中以编程方式生成自己的keytab吗?

时间:2014-04-24 13:08:48

标签: java kerberos apacheds

我想知道是否有一种方法可以在java中生成我自己的keytab而无需转到kdc?我在ApachDS测试中发现了类似的代码:

    Keytab keytab = Keytab.getInstance(); 
    KerberosTime timeStamp = new KerberosTime(KerberosUtils.UTC_DATE_FORMAT.parse("20070217235745Z"));

    Map<EncryptionType, EncryptionKey> keys = KerberosKeyFactory
        .getKerberosKeys(principalName, userPassword);



    KeytabEntry keytabEntry = new KeytabEntry(
        principalName, 
        1L,
        timeStamp, 
        (byte) 0,
        keys.get(EncryptionType.DES_CBC_MD5));

    List<KeytabEntry> entry = Arrays.asList(keytabEntry);

    keytab.setEntries(entry);

    keytab.write(keytabFile);

    return keytabFile;

我能够在我创建的密钥表上创建一个klist:

Vno类型主要日期别名

0 des-cbc-md5 ssh/localhost@EXAMPLE.COM 2007-02-17

此外,如果这不可能,有没有办法以编程方式使用ApacheDS或任何其他Java库获取密钥表?

3 个答案:

答案 0 :(得分:1)

对于主体,KDC中的每个enctype商店的keytab中必须包含3个内容。

  1. 主要名称

  2. 关键值

  3. 密钥版本号

  4. 如果你知道校长的密码,你可以重新创建前两个,但是最后一个要求你联系KDC。您还需要使用密码来创建KDC中的所有enctype。你想要做的事情在理论上是可行的,但在实践中它很难实现。如果在密钥表中使用knvo = 0,则表示&#34;针对任何版本号尝试此密钥&#34;这可能会让你解决大部分问题。

    使用委托人和密码可以实现的目标是&#34; bootstrap&#34; 这个过程。如果您可以获得至少包含一个工作密钥的密钥表,则应该 能够使用该密钥表来更新&#34; keytab与新版本的所有 来自KDC的密钥使用系统实用程序,如ktutil。

    作为旁注:如果可能的话,des-cbc-md5不应该被用作enctype,这些天它可以用非常适中的硬件资源进行暴力破解。

    不幸的是,下载keytabs的kadmin协议在kerberos版本之间有所不同,我不知道他们中的任何一个是否有java API。

答案 1 :(得分:0)

Java有一个KeyTab类,您可以使用它来读取Keytabs和keytab条目: http://docs.oracle.com/javase/7/docs/api/javax/security/auth/kerberos/KeyTab.html

如果要创建keytab,可以使用命令行工具创建Keytabs。它不需要连接到KDC(对于exapm:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/ktab.html

答案 2 :(得分:0)

我知道这个问题是特定于Java的,但这是Python中的示例,因为它只是调用ktutil工具来创建keytab,所以它也很容易被采用到其他语言中:

https://github.com/Tagar/stuff/blob/master/keytab.py

希望这有帮助。