从Java/Windows7使用Kerberos连接到Postgres DB

从Java/Windows7使用Kerberos连接到Postgres DB,java,postgresql,jdbc,kerberos,Java,Postgresql,Jdbc,Kerberos,我到处找过,问过很多人,但到目前为止没有人能帮我。我正试图通过Java(8)应用程序从我的windows(7)笔记本电脑连接到远程机器上的postgres(9.6)数据库。我们使用Kerberos来保护访问,但我有一个有效的Kerberos帐户,可以通过de Ticket Manager创建票据。我还可以登录到其他需要Kerberos身份验证的“服务”,尽管不是通过java而是通过浏览器 但不管我怎么做,我都无法让我的java程序正常工作。以下是我得到的: krb5.ini [libdefaul

我到处找过,问过很多人,但到目前为止没有人能帮我。我正试图通过Java(8)应用程序从我的windows(7)笔记本电脑连接到远程机器上的postgres(9.6)数据库。我们使用Kerberos来保护访问,但我有一个有效的Kerberos帐户,可以通过de Ticket Manager创建票据。我还可以登录到其他需要Kerberos身份验证的“服务”,尽管不是通过java而是通过浏览器

但不管我怎么做,我都无法让我的java程序正常工作。以下是我得到的:

krb5.ini

[libdefaults]
default_realm = <domain>
forwardable = true
kdc_timesync = 1
ccache_type = 4
proxiable = true
dns_lookup_kdc = true
dns_lookup_realm = true

[realms]
<domain>.NET = {
    admin_server = <domain-server>
    default_domain = <domain>
}

[domain_realm]
.<domain> = <domain>
<domain>  = <domain>
.local.nl.<company>.com = <domain>
local.nl.<company>.com = <domain>
 [login]
krb4_convert = true
krb4_get_tickets = false
我曾经遇到过其他异常,表明它找不到keytab文件,但通过上面的设置,它似乎可以工作。我还可以从我的机器ping postgres数据库


我发现:但没有解决方案

我终于在jaas.conf中使用了以下设置:

pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
refreshKrb5Config=true
doNotPrompt=false
useTicketCache=false
renewTGT=false
useKeyTab=true
keyTab="<location>/<filename>.keytab"
debug=true
client=true
principal="<username>@<domain>";
};
pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
refreshKrb5Config=true
doNotPrompt=true
useTicketCache=true
renewTGT=true
useKeyTab=true
keyTab="c:/<locationto>/<user>.keytab"
debug=true
client=true
principal="<user>@<domain>";
};
pgjdbc{
需要com.sun.security.auth.module.Krb5LoginModule
refreshKrb5Config=true
doNotPrompt=true
useTicketCache=true
renewTGT=true
useKeyTab=true
keyTab=“c://.keyTab”
调试=真
client=true
主体=“@”;
};

也就是说,doNotPrompt、useTicketCache、renewTGT的组合终于让它工作起来了

当我看到receive上的套接字超时时,我的第一个想法是防火墙问题。嗨,John,谢谢你的输入。我记得有人提到过,stacktrace暗示它正在使用UDP,这可能会被防火墙阻止(?)。如果是这种情况,我如何将其设置为使用TCP/IPUpdate:在krb5.ini中添加了“udp_preference_limit=1”以使用TCP,但现在我得到了“连接超时”,因此我认为您是对的,这是一个防火墙问题。奇怪的是,其他人虽然使用Mac电脑,却可以连接到数据库。我会和DBA的人核实一下。
Debug is  true storeKey false useTicketCache false useKeyTab true doNotPrompt false ticketCache is null isInitiator true KeyTab is c:/tmp/<username>.keytab refreshKrb5Config is true principal is <username>@<domain> tryFirstPass is false useFirstPass is false storePass is false clearPass is false
Refreshing Kerberos configuration
[Krb5LoginModule] authentication failed 
Receive timed out
org.postgresql.util.PSQLException: GSS Authentication failed
at org.postgresql.gss.MakeGSS.authenticate(MakeGSS.java:65)
....    
Caused by: java.net.SocketTimeoutException: Receive timed out
at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)
at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)
at java.net.DatagramSocket.receive(DatagramSocket.java:812)
at sun.security.krb5.internal.UDPClient.receive(NetClient.java:206)
at sun.security.krb5.KdcComm$KdcCommunication.run(KdcComm.java:411)
at sun.security.krb5.KdcComm$KdcCommunication.run(KdcComm.java:364)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.krb5.KdcComm.send(KdcComm.java:348)
at sun.security.krb5.KdcComm.sendIfPossible(KdcComm.java:253)
at sun.security.krb5.KdcComm.send(KdcComm.java:229)
at sun.security.krb5.KdcComm.send(KdcComm.java:200)
at sun.security.krb5.KrbAsReqBuilder.send(KrbAsReqBuilder.java:316)
at sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:361)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:776)
... 45 more
pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
refreshKrb5Config=true
doNotPrompt=true
useTicketCache=true
renewTGT=true
useKeyTab=true
keyTab="c:/<locationto>/<user>.keytab"
debug=true
client=true
principal="<user>@<domain>";
};