首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java/Windows7 7用Kerberos连接Postgres DB

从Java/Windows7 7用Kerberos连接Postgres DB
EN

Stack Overflow用户
提问于 2017-09-22 17:40:07
回答 1查看 3.4K关注 0票数 4

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

但是无论我尝试什么,我都不能让我的java程序工作。我要说的是:

krb5.ini

代码语言:javascript
复制
[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

jaas.conf:

代码语言:javascript
复制
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>";
};

.keytab文件

代码语言:javascript
复制
public class KerberosPostgresClient {
static {
        System.setProperty("java.security.krb5.conf","c:/tmp/krb5.ini");
        System.setProperty("java.security.krb5.realm","<domain>");
        System.setProperty("java.security.krb5.kdc","<domain>");
        System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
        System.setProperty("java.security.auth.login.config","c:/tmp/jaas.conf"); }

@Test
public void test() throws Exception {
    String url = "jdbc:postgresql://<hostname>:<port>/<database>";
    Properties properties = new Properties();
    properties.setProperty("JAASConfigName", "pgjdbc");
    try (Connection conn = DriverManager.getConnection(url, connInfo)) {
        conn.createStatement();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

非常简单的java代码可以找到keytab,jaas.conf。我在另一台机器上创建了keytab文件,但使用的是相同的主体和密码。

当我运行程序时,我看到:

代码语言:javascript
复制
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

过了一会儿,我得到了一个例外:

代码语言:javascript
复制
[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

我曾经得到其他的异常,这表明它找不到keytab文件,但是有了上面的设置,它似乎可以工作。我也可以在我的机器上打开postgres数据库。

我发现:Error connecting to PostgreSQL 9.4 with MIT Kerberos via JDBC vs CLI但没有解决方案

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-25 07:28:37

我终于让它在我的jaas.conf中使用以下设置:

代码语言:javascript
复制
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>";
};

即doNotPrompt、useTicketCache、renewTGT三者的结合,最终使其发挥作用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46370374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档