Hi,

I was wondering if anyone can help me with learning how to use thrift with SSL. At the moment, there is absolutely no documentation about how to use it, and I have had little success trying to work it out from the code.

Ultimately I'd like to have it working with both a server and a client certificate, but first it would be good to be able to do it just with a server certificate.

I am testing with the sample service in the Objective-C tutorial, but I am doing the client and server in C++. Here's what I have now:

Server:
#include "gen-cpp/UserStorage.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>
#include <transport/TSSLServerSocket.h>
#include <transport/TSSLSocket.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;

class UserStorageHandler : virtual public UserStorageIf {
 public:
  UserStorageHandler() {
    // Your initialization goes here
  }

  void store(const UserProfile& user) {
    // Your implementation goes here
    printf("store\n");
  }

  void retrieve(UserProfile& _return, const int32_t uid) {
    // Your implementation goes here
    printf("retrieve\n");
  }

};

int main(int argc, char **argv) {
    int port = 9090;
    shared_ptr<UserStorageHandler> handler(new UserStorageHandler());
    shared_ptr<TProcessor> processor(new UserStorageProcessor(handler));

    shared_ptr<TSSLSocketFactory> factory(new TSSLSocketFactory());
    factory->server(true);
    factory->authenticate(false);
    factory->loadCertificate("certificate/server.crt");
    factory->loadPrivateKey("certificate/server.key");


shared_ptr<TServerTransport> serverTransport(new TSSLServerSocket(port, factory)); shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory()); shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
    server.serve();
    return 0;
}

And the client:
#include "gen-cpp/UserStorage.h"
#include "gen-cpp/test_types.h"

#include <transport/TSSLSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TBinaryProtocol.h>

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

int main(int argc, char **argv) {
    boost::shared_ptr<TSSLSocketFactory> factory(new TSSLSocketFactory());
    factory->authenticate(true);

boost::shared_ptr<TSSLSocket> socket(factory->createSocket("localhost", 9090)); boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

    UserStorageClient client(protocol);
    transport->open();

    UserProfile test;

    client.retrieve(test, 12);
    transport->close();

    return 0;
}

Sorry for the code dump, and thanks a lot,

Stephen Gentle

Reply via email to