2017-09-22 14 views
3

私はあらゆる場所を見て、多くの人に尋ねましたが、今まで誰も助けてくれませんでした。私はWindows(7)ラップトップからJava(8)アプリケーションを介してリモートマシン上のpostgres(9.6)データベースに接続しようとしています。私たちはアクセスを保護するためにKerberosを使用しますが、有効なKerberosアカウントを持っており、チケットマネージャー経由でチケットを作成することができます。私はKerberos認証を必要とする他の「サービス」にもログオンすることができますが、javaではなくブラウザ経由で行うことができます。Java/Windows7のKerberosを使ってPostgres DBに接続

私は何をしようと、私は私の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 

を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>"; 
}; 

.keytabファイル

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ファイルを別のマシンに作成しましたが、プリンシパルとパスワードは同じです。私はプログラムを実行すると

iは、以下を参照してください。

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 
私はそれを見つけることができなかったことが示された他の例外を取得するために使用

keytabファイルが上記の設定で動作するようです。自分のマシンからpostgresデータベースにpingすることもできます。

は、私が見つかりました:Error connecting to PostgreSQL 9.4 with MIT Kerberos via JDBC vs CLIしかし、私は最終的に、それは私のjaas.confをで以下の設定で作業してしまった

+0

を作業それを得ました。 –

+0

こんにちはJohnさん、あなたのご意見ありがとうございます。スタックトレースはUDPを使用していることを意味し、ファイアウォール(?)によってブロックされる可能性があります。 TCP/IPを使用するように設定するにはどうすればいいですか? – mroosendaal

+0

アップデート:krb5.iniに "udp_preference_limit = 1"を追加してTCPを使用するようにしましたが、今は "接続タイムアウト"になるので、ファイアウォールの問題です。他の人は、Macを使ってデータベースに接続することはできますが、それは奇妙です。私はDBAの人たちに確認します。 – mroosendaal

答えて

2

何の解決策がありません:

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の組み合わせは、最終的に私は私の最初の考えはファイアウォールの問題である受信上のソケットのタイムアウトを見たとき

+0

素晴らしい仕事。あなたの答えを自分で受け入れてください。 –

関連する問題