**И така, предполагам, че има начин да направите това чрез 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/[email protected]
"my.server.com", // kerberos principal server - myprincipal/[email protected]
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
Примерен клиентски код
TTransport transport = new TSocket("my.server.com", 7911); // client to connect to server and port
saslProperties.put(Sasl.QOP, "true");
saslProperties.put(Sasl.QOP, "auth-conf"); // authorization and confidentiality
TTransport saslTransport = new TSaslTransport(
"GSSAPI", // tell SASL to use GSSAPI, which supports Kerberos
null, // authorizationid - null
"myserviceprincipal", // base kerberos principal name - myprincipal/[email protected]
"my.server.com", // kerberos principal server - myprincipal/[email protected]
saslProps, // Properties set, above
null, // callback handler - null
transport); // underlying transport
TProtocol protocol = new TBinaryProtocol(saslTransport); // set up our new Thrift protocol
HelloWorldService.Client client = new HelloWorldService.Client(protocol); // Setup our thrift client
saslTransport.open();
String response = client.hello("Hi There"); // send message
System.out.println("response = " + response);
transport.close();
Други съображения:
* Зададох няколко свойства на Java както на клиента, така и на сървъра.
- java.security.krb5.realm = MY.REALM // име на сфера
- 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 много добре, когато започнах.
Благодаря за четенето.
person
Wanderer
schedule
12.12.2012