occlum/demos/grpc/grpc_tls/greeter_secure_server.cc
2022-01-05 15:09:54 +08:00

99 lines
1.9 KiB
C++

#include <memory>
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#include <grpc++/grpc++.h>
#include "helloworld.grpc.pb.h"
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using helloworld::HelloRequest;
using helloworld::HelloReply;
using helloworld::Greeter;
class GreeterServiceImpl final : public Greeter::Service
{
Status SayHello ( ServerContext* context,
const HelloRequest* request,
HelloReply* reply ) override
{
std::string prefix ( "Hello " );
reply->set_message ( prefix + request->name () );
return Status::OK;
}
};
void
read ( const std::string& filename, std::string& data )
{
std::ifstream file ( filename.c_str (), std::ios::in );
if ( file.is_open () )
{
std::stringstream ss;
ss << file.rdbuf ();
file.close ();
data = ss.str ();
}
return;
}
void
runServer()
{
/**
* [!] Be carefull here using one cert with the CN != localhost. [!]
**/
std::string server_address ( "localhost:50051" );
std::string key;
std::string cert;
std::string root;
read ( "server.crt", cert );
read ( "server.key", key );
read ( "ca.crt", root );
ServerBuilder builder;
grpc::SslServerCredentialsOptions::PemKeyCertPair keycert =
{
key,
cert
};
grpc::SslServerCredentialsOptions sslOps;
sslOps.pem_root_certs = root;
sslOps.pem_key_cert_pairs.push_back ( keycert );
builder.AddListeningPort(server_address, grpc::SslServerCredentials( sslOps ));
GreeterServiceImpl service;
builder.RegisterService(&service);
std::unique_ptr < Server > server ( builder.BuildAndStart () );
std::cout << "Server listening on " << server_address << std::endl;
server->Wait ();
}
int
main ( int argc, char** argv )
{
runServer();
return 0;
}