如何从java代码连接到在Windows系统上使用kerberos的远程mongodb?

时间:2016-09-12 11:34:42

标签: java mongodb kerberos

我是mongodb和kerberos的新手。我有一个使用kerberos身份验证的远程mongodb设置。现在我有一台Windows机器,必须通过java代码连接到远程mongodb实例。我正在使用下面连接良好的代码,但在执行过程中要求用户名和密码,我需要避免。我在谷歌搜索了很多,发现我需要提供keytab文件,但不知道如何在Windows机器上生成它?任何帮助将不胜感激。

注意:我无法访问在远程计算机上运行的mongodb服务器和kerberos。

System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
System.setProperty("java.security.krb5.realm", "have a proper value here");
System.setProperty("java.security.krb5.kdc", "have a proper value here");

String server = "have a valid host here";
String user = "valid user name";
String databaseName = "valid database name";


MongoCredential credential = MongoCredential.createGSSAPICredential(user);
MongoClient mongoClient = new MongoClient(new ServerAddress(server, "valid port"), Arrays.asList(credential));

1 个答案:

答案 0 :(得分:0)

您的问题是如何在Windows计算机上生成密钥表。必须使用ktpass.exe命令在成员服务器或Active Directory域的域控制器上生成Keytab。使用Windows Server内置实用程序ktpass.exe创建密钥表。请注意,必须在Windows Server操作系统上创建Keytabs,因为它们无法在工作站操作系统上创建,例如Windows 7,8或Windows 10.运行ktpass.exe时,命令行shell(cmd.exe)必须是以管理员身份运行”。如果启用了用户帐户控制(UAC),则必须禁用该帐户。必须以这样的方式创建密钥表:它包含服务主体名称,领域名称以及密钥表中与服务主体相关的AD用户或计算机帐户的密码的加密哈希。为此,下面给出了一个示例命令。

ktpass -out centos1-dev-local.keytab -mapUser krbCentos@DEV.LOCAL + rndPass -mapOp set + DumpSalt -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -prin HTTP /centos1.dev.local@DEV.LOCAL

上面的命令示例创建了一个名为 centos1-dev-local.keytab 的密钥表,以便在名为DEV.LOCAL的AD域中使用。有关其他参考,您可以在Microsoft Technet上阅读有关Kerberos键盘的文章:Kerberos Keytabs – Explained。我经常回头根据我在这个论坛上看到的问题进行编辑。