dem*_*319 8 c++ ssl openssl thrift
这是我生成SSL证书,密钥等的方式:
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
Run Code Online (Sandbox Code Playgroud)
这有效,我可以看到chrome的输出,虽然我得到一个警告,我将首先得到病毒.
openssl s_server -cert server.crt -www -key new_key.pem
Run Code Online (Sandbox Code Playgroud)
这是服务器的一个片段.我会说实话,我不确定每条线路到底在做什么,尽管我有个好主意:
socketFactory->server(true); // this is the server
socketFactory->authenticate(false); // no auth?
socketFactory->loadCertificate("server.crt");
socketFactory->loadPrivateKey("new_key.pem");
Run Code Online (Sandbox Code Playgroud)
客户:
socketFactory->loadTrustedCertificates("server.crt");
socketFactory->authenticate(true); //auth? wierd, right? This guy does this:[1]
Run Code Online (Sandbox Code Playgroud)
[1] http://permalink.gmane.org/gmane.comp.lib.thrift.user/1651
如果我loadTrustedCertificates在客户端注释掉,那么我将获得SSL未经验证的证书例外.留下该行,我得到一个auth失败异常.
这里有两个更长的代码片段,它们将上述片段放在更好的视角中.
服务器:
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();
Run Code Online (Sandbox Code Playgroud)
客户:
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();
Run Code Online (Sandbox Code Playgroud)
感谢您抽时间阅读.如果有明显的错误,我会很高兴听到它.这已成为我存在的祸根太久了.太长.
mar*_*o.m 11
您似乎正在生成自签名证书(这很好),但您使用该openssl实用程序所做的操作令人困惑.
第1行没问题,它会生成一个私钥.
第2行无用:输出键与输入键相同!(尝试diff两个键看).
第3行生成CSR,第4行实际上对其进行自签名,因此我们可以将它们合并在一行中.
现在,让我们退一步让我们试着了解我们在做什么:-)
您正在使用SSL对Thrift服务器和Thrift客户端之间的通信进行身份验证和加密.我假设你想要两个:
要进行HTTPS类比,(1)是经典服务器证书,(2)通常是用户的用户名/密码.但是使用Thrift SSL,我们将通过向客户端颁发证书来获得相互身份验证.
我将做的示例将使用自签名证书.它们很容易适应由openssl管理的迷你CA,我把这作为练习留给读者.
生成服务器私钥:
openssl genrsa -out server-key.pem 2048
生成关联的公钥并对其进行自签名:
openssl req -new -x509 -key server-key.pem -out server-cert.pem -days 10000
生成客户端私钥:
openssl genrsa -out client-key.pem 2048
生成关联的公钥并对其进行自签名:
openssl req -new -x509 -key client-key.pem -out client-cert.pem -days 10000
注意:openssl req请求时"Common Name (e.g. server FQDN or YOUR name)",将运行Thrift程序的主机的FQDN.这将不允许自定义Thrift的AccessManager类.另一方面,如果事先无法知道FQDN,则需要相应地继承AccessManager和覆盖这些verify()方法.见TSSLSocket.cpp.
好,现在到代码.
在服务器端:
socketFactory->server(true); 是多余的,删除它.
socketFactory->authenticate(false)有点误导.一个更好的名字本来就是authenticatePeer.如果你说false,它不会对客户端进行身份验证,但我们在进行相互身份验证之前就决定了.
因此,服务器的SSL前导码是:
try {
signal(SIGPIPE, SIG_IGN); // See README.SSL
shared_ptr<TSSLSocketFactory> sslSocketFactory(new TSSLSocketFactory());
sslSocketFactory->loadPrivateKey(myKey);
sslSocketFactory->loadCertificate(myCert);
sslSocketFactory->authenticate(true);
sslSocketFactory->loadTrustedCertificates(trustedCerts);
sslSocketFactory->ciphers("HIGH:!DSS:!aNULL@STRENGTH");
...
} catch (TException& tx) {
....
}
Run Code Online (Sandbox Code Playgroud)
当myKey是server-key.pem,myCert是server-cert.pem和 trustedCerts是...或者是信任的CA的证书,或在自签名的证书,客户端的证书的情况.您可以cat在同一个文件中一个接一个地使用多个证书.在我们的示例中,我们将放置client-cert.pem之前创建的.
客户端的SSL前导码完全相同,具有正确的客户端私钥,客户端证书以及对trustedCerts等的证书:server-cert.pem我们之前创建的.
这就是:-)在跳转到编码之前尝试理解,如果你没有清楚地了解SSL(相互)认证是如何工作的,那么很难理解错误信息.我展示的代码经过测试可行.
文档方面,不幸的是Thrift几乎没有.对于SSL,可以看到:lib/cpp/README.SSL,test/cpp/src/TestServer.cpp和test/cpp/src/TestClient.cpp.请注意,TestServer.cpp不做相互认证,这是一个错误恕我直言.
| 归档时间: |
|
| 查看次数: |
4116 次 |
| 最近记录: |