【问题标题】:Can I use a self signed certificate to encrypt gRPC in .NET我可以使用自签名证书在 .NET 中加密 gRPC
【发布时间】:2021-04-26 02:52:33
【问题描述】:

我花了相当多的时间试图研究这个,但不能真正找到一个确凿的答案。我可以找到一年前的帖子,声称这在 grpc 的 C#/.NET 实现中不起作用。

我已经使用 openssl 创建了一个自签名证书,如下所示:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 3650

我创建了凭据:

var keyCertPair = new KeyCertificatePair(File.ReadAllText(@"c:\temp\cert.pem"), File.ReadAllText(@"c:\temp\key.pem"));

var credentials = new SslServerCredentials(new[] { keyCertPair });

var server = new Grpc.Core.Server
 {
      Services = { ServerVersionGrpcService.BindService(serverVersionService).Intercept(exceptionInterceptor) },
      Ports = { new ServerPort("localhost", 5001, credentials) }
};

server.Start();

但是现在我的服务抛出异常

System.IO.IOException: '绑定端口“localhost:5001”失败

我在这里错过了什么?

【问题讨论】:

  • 5001 上是否有正在运行的内容?如果你使用不同的端口怎么办?你的代码对我有用。
  • 我已经添加了我的复制品(如下)。不幸的是,在 Stackoverflow 中,反对票是生活的一部分。在这种情况下,这可能是您非常简短的问题的结果。对于熟悉 C# 的人来说,这可能很明显,但我不是,我花了一点时间来重新创建您的源代码。最好包含更多详细信息,然后包含您所做的事情、观察到的事情以及尝试过的事情。
  • 我想是的,但我没有在这里问很多问题,所以我会犯错误,当我问是否仍然是自签名不的情况时,我想我很清楚在 c# 实现中工作,我花了几个小时试图找到答案。而且我很乐意投反对票,但更有建设性会更有帮助,这样我下次可以做得更好。

标签: c# .net grpc


【解决方案1】:

以下内容对我有用,假设 ${PWD}/app 中的所有内容:

  1. 创建自签名证书|密钥:
openssl req \
-x509 \
-newkey rsa:2048 \
-keyout ./app/localhost.key \
-out ./app/localhost.crt \
-nodes \
-days 365 \
-subj "/CN=localhost"
  1. 运行时

我在容器中使用dotnet

GRPC="50052"
docker run \
--rm --interactive --tty \
--volume=${PWD}/app:/app \
--workdir=/app \
--publish=${GRPC}:50051 \
mcr.microsoft.com/dotnet/sdk:5.0 \
  bash

还有:

dotnet new console

# Optional
dotnet add package Google.Protobuf --version 3.8.0
dotnet add package Grpc --version 2.23.0
dotnet add package Grpc.Core --version 2.23.0
dotnet add package Grpc.Tools --version 2.23.0
  1. 代码

您的代码,但使用 repo 的 greet.proto 示例:

using Grpc.Core;
using System;
using System.Threading.Tasks;
using System.IO;

namespace app {
  public class GreeterService: Greeter.GreeterBase {
    public override Task<HelloReply> SayHello(
      HelloRequest request,
      ServerCallContext context
    ) {
      Console.WriteLine("[SayHello] Entered");
      return Task.FromResult(new HelloReply {
        Message = "Hello " + request.Name
      });
    }
  }
  class Program {
    const int Port = 50051;
    static void Main(string[] args) {
      var keyCertPair = new KeyCertificatePair(
        File.ReadAllText(@"localhost.crt"),
        File.ReadAllText(@"localhost.key")
      );

      var credentials = new SslServerCredentials(new []{
        keyCertPair
      });

      var server = new Server {
        Services = { Greeter.BindService(new GreeterService()) },
          Ports = { new ServerPort("0.0.0.0", Port, credentials) }
      };

      server.Start();

      Console.WriteLine("gRPC Server [:" + Port + "]");
      Console.WriteLine("Press any key to stop the server...");
      Console.ReadKey();

      server.ShutdownAsync().Wait();
    }
  }
}

还有:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.8.0" />
    <PackageReference Include="Grpc" Version="2.23.0" />
    <PackageReference Include="Grpc.Core" Version="2.23.0" />
    <PackageReference Include="Grpc.Tools" Version="2.23.0" PrivateAssets="All" />
  </ItemGroup>

  <ItemGroup>
    <Protobuf Include="greet.proto" />
  </ItemGroup>

</Project>
  1. 添加libc-dev

根据这个comment

您需要:

apt update && apt -y install libc-dev
  1. 测试:
GRPC="50052"

grpcurl \
-insecure \
-cert app/localhost.crt \
-key app/localhost.key \
-proto app/greet.proto \
-d '{"name":"Freddie"}' \
localhost:${GRPC} \
Greeter.SayHello

产量:

{
  "message": "Hello Freddie"
}

【讨论】:

  • 我终于设法解决了这个问题,我找到了一个生成 3 个 pfx 证书文件的 powershell 脚本,并将它们安装到我将根证书设置为受信任的 certstore,然后我从pfx 使用 openssl。一个用于证书,一个用于私钥,并为我的 KeyCertificatePair 加载了这些,现在它可以工作了 :) 感谢您抽出时间来帮助我!
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 2016-02-13
  • 2013-11-10
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多