Certificado SSL, no se autentica a través de thrift, pero está bien a través del navegador

Así es como genero mi certificado SSL, clave, etc:

openssl genrsa -out server.key 1024
openssl rsa -in server.key -out new_key.pem
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 10000 -in server.csr -signkey new_key.pem -out server.crt

Esto funciona, puedo ver la salida en Chrome, aunque recibo una advertencia de que primero obtendré virus.

openssl s_server -cert server.crt -www -key new_key.pem

Este es un fragmento del servidor. Seré honesto, no estoy seguro de lo que está haciendo exactamente cada línea, aunque tengo una buena idea:

socketFactory->server(true); // this is the server
socketFactory->authenticate(false); // no auth?
socketFactory->loadCertificate("server.crt"); 
socketFactory->loadPrivateKey("new_key.pem");

cliente:

socketFactory->loadTrustedCertificates("server.crt");
socketFactory->authenticate(true); //auth? wierd, right? This guy does this:[1]

[1]http://permalink.gmane.org/gmane.comp.lib.thrift.user/1651

Si yo comentoloadTrustedCertificates en el cliente, obtengo una excepción de certificado SSL no verificada. Con esa línea en la izquierda, obtengo una excepción de fallo de autenticación

Aquí hay 2 fragmentos de código mucho más largos, que ponen los fragmentos anteriores en una mejor perspectiva.
servidor:

shared_ptr<SkullduggeryHandler> handler(new SkullduggeryHandler());
shared_ptr<TBufferedTransportFactory> transportFactory =
        shared_ptr<TBufferedTransportFactory>(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<TProcessor> processor(new SkullduggeryProcessor(handler));
shared_ptr<TSSLSocketFactory> socketFactory = 
      shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
socketFactory->server(true);
socketFactory->authenticate(false);
socketFactory->loadCertificate("server.crt");
socketFactory->loadPrivateKey("new_key.pem");
shared_ptr<TSSLServerSocket> socket(new TSSLServerSocket(port, socketFactory));
TThreadedServer server(processor,
                               socket,
                               transportFactory,
                               protocolFactory);
server.serve();

cliente:

shared_ptr <TSSLSocketFactory> socketFactory = shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
socketFactory->loadTrustedCertificates("server.crt");
socketFactory->authenticate(false);
shared_ptr <TSSLSocket>socket = socketFactory->createSocket(configuration.ip, configuration.port);
shared_ptr<TBufferedTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
SkullduggeryClient client(protocol);
transport->open();

Gracias por tomarse el tiempo para leer esto. Si hay errores evidentes, me alegraría saberlo. Esta ha sido la pesadilla de mi existencia durante demasiado tiempo. Demasiado largo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta