Java 为了节约?

Java 为了节约?,java,kerberos,thrift,gssapi,Java,Kerberos,Thrift,Gssapi,我编写了一个简单的基于节约的java应用程序。它实际上非常简单,只不过是java中使用Thrift的“Hello World”消息传输。有人告诉我,我需要向消息中添加Kerberos支持。我在谷歌上搜索了一下,很惊讶Thrift还没有某种形式的Kerberos支持(或者如果有,我找不到)。我曾考虑使用GSSAPI编写自己的包装器,但我无法包装/打开我的旧邮件,因为这会破坏旧邮件格式 有人曾经节俭过吗?。。或者知道怎么做 提前感谢。**因此,我想有一种方法可以通过SASL/GSS API实现这一点

我编写了一个简单的基于节约的java应用程序。它实际上非常简单,只不过是java中使用Thrift的“Hello World”消息传输。有人告诉我,我需要向消息中添加Kerberos支持。我在谷歌上搜索了一下,很惊讶Thrift还没有某种形式的Kerberos支持(或者如果有,我找不到)。我曾考虑使用GSSAPI编写自己的包装器,但我无法包装/打开我的旧邮件,因为这会破坏旧邮件格式

有人曾经节俭过吗?。。或者知道怎么做


提前感谢。

**因此,我想有一种方法可以通过SASL/GSS API实现这一点。这让我很困惑,为什么我没有在任何地方的互联网上看到这方面的好例子。然而,我张贴了一个我所创造的例子,希望它能对其他人有所帮助。。。或者有人可以纠正我在这里做有用的事情的错觉。

示例服务器代码:

TServerSocket serverTransport = new TServerSocket(7911);  // new server on port 7911
HelloWorldService.Processor<Iface> processor = new HelloWorldService.Processer<Iface>(new ThriftServerImpl());  // This is my thrift implementation for my server
Map<String, String> saslProperties = new HashMap<String, String>();  // need a map for properties
saslProperties.put(Sasl.QOP, "true");
saslProperties.put(Sasl.QOP, "auth-conf");  // authorization and confidentiality

TSaslServerTransport.Factory saslTransportFactory = new TSaslServerTransport.Factory();     // Creating the server definition
saslTransportFactory.addServerDefinition(
            "GSSAPI",       //  tell SASL to use GSSAPI, which supports Kerberos
            "myserviceprincipal",   //  base kerberos principal name - myprincipal/my.server.com@MY.REALM 
            "my.server.com",    //  kerberos principal server - myprincipal/my.server.com@MY.REALM
            saslProps,      //  Properties set, above
            new SaslRpcServer.SaslGssCallbackHandler()));  //  I don't know what this really does... but I stole it from Hadoop and it works.. so there.

Tserver server = new TThreadPoolServer(newTThreadPoolSErver.Args(serverTransport).transportFactory(saslTrasnportFactory).processor(processor));

server.serve();   // Thrift server start
其他条件:

*我在客户端和服务器上都设置了几个java属性。
-java.security.krb5.realm=MY.realm//realm name
-java.security.krb5.kdc=my.kdc.com//kdc服务器
-javax.security.auth.useSubjectCredsOnly=false//允许JAAS获取TGT。
-java.security.auth.login.config=/etc/myapp/conf/jaas.conf-必需的jaas文件
-sun.security.krb5.debug=true//帮助诊断问题。
*上面指定的jaas.conf文件需要有两个条目(每个服务器可能只有一个…)。我记不起我是从哪里收集到这个信息的。。但这是我的档案:

com.sun.security.jgss.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/etc/myapp/conf/myapp.keytab"
    useTicketCache=true
    principal="myuserprincipal"
    debug=true;
};

com.sun.security.jgss.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/etc/myapp/conf/myapp.keytab"
    useTicketCache=false
    principal="myserviceprincipal/my.server.com"
    debug=true;
};
(回到考虑事项……)
*尽管Sasl.QOP为“auth conf”。。传输的第一条(?)消息未加密。也许这只是握手之类的。其余的消息似乎已加密,但第一条消息会将一条丑陋的消息打印到控制台“对等方未执行加密”。如果没有得到这个信息那就太好了,因为它会在今后的道路上造成悲伤(无论是否合理)。

不管怎样,我希望这能帮助一些人。。。或者,也可以激发一些对我有帮助的改进。:)很难相信我花了2-3天的时间来做这件事,而且只产生了少量的代码,但我在开始时对Kerberos和Thrift都不太了解


感谢阅读。

看起来好像Hadoop可能在这方面做了些什么。。。
com.sun.security.jgss.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/etc/myapp/conf/myapp.keytab"
    useTicketCache=true
    principal="myuserprincipal"
    debug=true;
};

com.sun.security.jgss.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/etc/myapp/conf/myapp.keytab"
    useTicketCache=false
    principal="myserviceprincipal/my.server.com"
    debug=true;
};