How to enable server side SSL for gRPC?

后端 未结 3 513
盖世英雄少女心
盖世英雄少女心 2020-12-07 23:39

New to gRPC and couldn\'t really find any example on how to enable SSL on the server side. I generated a key pair using openssl but it complains that the private key is inv

3条回答
  •  悲&欢浪女
    2020-12-08 00:12

    Here's what I did.

    Using OpenSSL, generate certificates with the following:

    @echo off
    set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg   
    
    echo Generate CA key:
    openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
    
    echo Generate CA certificate:
    openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj  "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=MyRootCA"
    
    echo Generate server key:
    openssl genrsa -passout pass:1111 -des3 -out server.key 4096
    
    echo Generate server signing request:
    openssl req -passin pass:1111 -new -key server.key -out server.csr -subj  "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=%COMPUTERNAME%"
    
    echo Self-sign server certificate:
    openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
    
    echo Remove passphrase from server key:
    openssl rsa -passin pass:1111 -in server.key -out server.key
    
    echo Generate client key
    openssl genrsa -passout pass:1111 -des3 -out client.key 4096
    
    echo Generate client signing request:
    openssl req -passin pass:1111 -new -key client.key -out client.csr -subj  "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=%CLIENT-COMPUTERNAME%"
    
    echo Self-sign client certificate:
    openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
    
    echo Remove passphrase from client key:
    openssl rsa -passin pass:1111 -in client.key -out client.key
    

    Change password 1111 to anything you like

    Server:

    var cacert = File.ReadAllText(@"ca.crt");
    var servercert = File.ReadAllText(@"server.crt");
    var serverkey = File.ReadAllText(@"server.key");
    var keypair = new KeyCertificatePair(servercert, serverkey);
    var sslCredentials = new SslServerCredentials(new List() { keypair }, cacert, false);
    
    var server = new Server
    {
        Services = { GrpcTest.BindService(new GrpcTestImpl(writeToDisk)) },
        Ports = { new ServerPort("0.0.0.0", 555, sslCredentials) }
    };
    server.Start();
    

    Client:

    var cacert = File.ReadAllText(@"ca.crt");
    var clientcert = File.ReadAllText(@"client.crt");
    var clientkey = File.ReadAllText(@"client.key");
    var ssl = new SslCredentials(cacert, new KeyCertificatePair(clientcert, clientkey));
    channel = new Channel("localhost", 555, ssl);
    client = new GrpcTest.GrpcTestClient(channel);
    

    If "localhost" doesn't work, use the host name instead.

提交回复
热议问题