Certificado SSL, não autenticando via parcimônia, mas OK via navegador

É assim que eu gero meu certificado SSL, chave, 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

Isso funciona, eu posso ver a saída no chrome, embora eu receba um aviso de que eu vou pegar vírus primeiro.

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

Este é um trecho do servidor. Vou ser sincero, não sei exatamente o que cada linha está fazendo, embora eu tenha uma boa ideia:

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

Se eu comentarloadTrustedCertificates no cliente, recebo uma exceção de certificado SSL não verificado. Com essa linha deixada, recebo uma exceção de falha de autenticação.

Aqui estão dois fragmentos de código muito mais longos, que colocam os snippets acima em uma perspectiva melhor.
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();

Obrigado por tomar o tempo para ler este. Se houver erros gritantes, ficarei feliz em saber disso. Esta tem sido a ruína do meu existense por muito tempo agora. Demasiado longo.

questionAnswers(1)

yourAnswerToTheQuestion