有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过JDBC vs CLI使用MIT Kerberos连接到PostgreSQL 9.4时发生java错误

我已经用MIT Kerberos 5设置了PostgreSQL 9.4,并且可以使用psql在CLI上进行连接。把指纹归档后,我的校长是bgiles/postgres@REALM,pg_hba。conf有

host    all             all             0.0.0.0/0        gss include_realm=1 map=gss krb_realm=REALM

还有警长。conf文件

gss     /^(.*)/postgres@REALM$ \1

我创建了这个主体,并将其保存到一个键表中

$ kinit -k -t krb5.keytab bgiles/postgres

我可以成功连接到我的PostgreSQL server“kpg”。这证明Kerberos和keytab设置正确

$ psql -h kpg dbname
(connection information...)

然而,当我使用同一个keytab通过JDBC连接时,我得到了一个GSS身份验证错误,这是因为PostgreSQL拒绝执行映射

2016-04-20 00:13:16 UTC [18919-1] bgiles/postgres@bgiles LOG:  no match in usermap "gss" for user "bgiles/postgres" authenticated as "bgiles/postgres@REALM"
2016-04-20 00:13:16 UTC [18919-2] bgiles/postgres@bgiles FATAL:  GSSAPI authentication failed for user "bgiles/postgres"
2016-04-20 00:13:16 UTC [18919-3] bgiles/postgres@bgiles DETAIL:  Connection matched pg_hba.conf line 100: "host    all     all     75.144.16.201/32    gss include_realm=1 map=gss krb_realm=REALM"

(我注意到@bfiles,怀疑这是问题的关键,但我完全被它难住了。)

测试代码是

public class KerberosPostgreSQLTest {

    static {
        URL url = Thread.currentThread().getContextClassLoader().getResource("jaas.conf");

        System.setProperty("java.security.auth.login.config", url.toExternalForm());
        System.setProperty("java.security.krb5.realm", "REALM");
        System.setProperty("java.security.krb5.kdc", "kdc");
    }

    @Test
    public void test() throws Exception {
        String url = "jdbc:postgresql://kpg/bgiles";
        String user = "bgiles/postgres";

        Properties connInfo = new Properties();
        connInfo.put("user", user);
        connInfo.put("jaasApplicationName", "pgjdbc");

        try (Connection conn = DriverManager.getConnection(url, connInfo)) {

        }
    }
}

JAAS配置文件是

pgjdbc {
    com.sun.security.auth.module.Krb5LoginModule required
    refreshKrb5Config=true
    doNotPrompt=true
    useTicketCache=true
    renewTGT=false
    useKeyTab=true
    keyTab="/tmp/krb5.keytab"
    debug=true
    client=true
    principal="bgiles/postgres"
    ;

}

PostgreSQL数据库肯定能识别有效的Kerberos连接尝试。它在从Kerberos主体映射到PostgreSQL用户id的最后一步犹豫不决。不知何故,java/jaas/jdbc代码正在破坏它,而在CLI上工作的东西无法通过jdbc工作

我使用了无数布尔标志的变体,添加或删除@REALM,并找到了许多方法来防止GSS身份验证发生,但没有任何方法可以让我连接到服务器

有什么想法吗?唯一的区别在于java/jaas/jdbc代码,但我不明白它如何得到一个仍然被KDC接受的损坏的主体。TGT问题

谢谢

忍受


共 (0) 个答案