AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 968343
Accepted
Toby 1 Kenobi
Toby 1 Kenobi
Asked: 2019-05-22 22:38:14 +0800 CST2019-05-22 22:38:14 +0800 CST 2019-05-22 22:38:14 +0800 CST

为什么我需要证书才能作为客户端建立安全的 gRPC 连接?

  • 772

当在普通 TCP 上使用 gRPC 时,客户端会像这样(在 ruby​​ 中)与服务器建立一个通道:

stub = Helloworld::Greeter::Stub.new(service_url, :this_channel_is_insecure)

但是,当我在服务器上实现 TLS 并在服务器上放入我的 LetsEncrypt 证书时,客户端必须建立一个像这样的安全连接(在 ruby​​ 中):

creds = GRPC::Core::Credentials.new(load_certs)  # load_certs typically loads a CA roots file
stub = Helloworld::Greeter::Stub.new(service_url, creds)

带有注释的代码取自官方 gRPC 文档。

我的问题是,为什么客户在这里需要证书?我认为是服务器需要证书,客户端确保它是有效的。当我的浏览器连接到安全网站时,它是否会将自己的证书带到桌面上?如果没有,为什么 gRPC 客户端需要一个?

从我的阅读中,客户端知道一些受信任的机构,服务器的证书链链接到其中之一。上面代码中的注释引用了一个“CA 根文件”,它可能是链顶部的权威证书。所以也许 gRPC 客户端会将服务器链根的证书与它自己的证书进行比较——但如果是这样的话,如果它得到错误的 CA 会发生什么?

所有解释如何从 gRPC 客户端建立安全连接的文档和帖子都说要从本地文件中读取证书,但没有一个说明该证书是什么,或者它来自哪里。

我错过了什么?

编辑:

我在我的计算机上发现了一个目录,其中包含一堆似乎是 CA 根证书的目录。/etc/ssl/certs/其中之一似乎是验证 LetsEncrypt 的授权,我在服务器上使用它,所以我尝试在客户端读取该证书,如下所示:

GRPC::Core::ChannelCredentials.new(File.read('/etc/ssl/certs/ISRG_Root_X1.pem'))

但它只导致了这个错误

握手失败,出现致命错误 SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED。

ssl
  • 1 1 个回答
  • 5471 Views

1 个回答

  • Voted
  1. Best Answer
    SkatEddy
    2019-12-25T09:09:27+08:002019-12-25T09:09:27+08:00

    gRPC 主要用于通过调用远程过程来连接服务,例如微服务。与 Web 服务器和多个浏览器客户端之间的单方信任关系相比,所涉及的双方必须明确地相互信任以避免中间人攻击。gRPC 通过设计为 TLS 安全连接强制执行此操作。

    在不安全(无 TLS 安全)连接(仅用于测试目的)的情况下,对于 gRPC 服务器,参数:this_port_is_insecure将传递给(GRPC::RpcServer.new).add_http2_port方法,对于每个涉及的 gRPC 客户端,参数channel_args: :this_channel_is_insecure将传递给Core::Stub.new方法。

    相反,在通过 TLS 进行安全连接的情况下,GRPC::Core::ServerCredentials.new client_ca_pem, [{private_key: server_key_pem, cert_chain: server_cert_pem}], true必须为 gRPC 服务器传递,并且 GRPC::Core::ChannelCredentials.new server_ca_pem, client_key_pem, client_cert_pem必须为每个客户端传递。

    对于所有 *_pem 变量,通过File.read从您的信任中心提供的相应 PEM 文件加载内容,或者可能之前自行生成:

    • server_ca_pem 是签署 server_cert_pem 的证书颁发机构
    • server_cert_pem 是服务器证书链,由客户端通过 server_ca_pem 证明
    • server_key_pem 是服务器的私钥
    • client_ca_pem 是签署了 client_cert_pem 的证书颁发机构
    • client_cert_pem 是客户端证书链,由服务器通过 client_ca_pem 证明
    • client_key_pem 是客户端的私钥

    server_ca_pem并且client_ca_pem可能相同也可能不同。GRPC::Core::CallCredentials如果您需要在呼叫级别保护服务-客户关系,请使用附加。

    gRPC 认证指南:

    https://grpc.io/docs/guides/auth/

    Ruby 代码示例:

    https://github.com/grpc/grpc/blob/master/src/ruby/spec/channel_credentials_spec.rb

    • 3

相关问题

  • 如何使用 Tomcat 5.5 更新 SSL 证书

  • 为 IIS6 自行生成 SSL 证书?

  • plesk 上的域和子域 ssl 访问

  • 如何设置 SSL 邮件服务器?

  • 如何通过 SVN 命令行接受 SSL 证书?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve