使用 TLS(Transport Layer Security)保护通信

Fabric 支持节点之间使用 TLS 进行安全通信。TLS 通信可以使用单向(仅服务器)和双向(服务器和客户端)身份验证。

为 Peer 节点配置 TLS

Peer 节点既是 TLS 服务器又是 TLS 客户端。当另一个 Peer 节点、应用程序或客户端与其建立连接时,它是前者;而当它与另一个 Peer 节点或排序节点建立连接时,则是后者。

要在 Peer 节点上启用 TLS,需要设置以下配置:

  • peer.tls.enabled = true
  • peer.tls.cert.file = 包含 TLS 服务器证书文件的标准路径
  • peer.tls.key.file = 包含 TLS 服务器私钥文件的标准路径
  • peer.tls.rootcert.file = 包含颁发 TLS 服务器证书 CA 证书链的标准路径

默认情况下,在 Peer 节点上启用 TLS 时,TLS 客户端身份验证是关闭的。这意味着在 TLS 握手期间, Peer 节点将不会验证客户端(另一个 Peer 节点、应用程序或CLI)的证书。要在 Peer 节点上启用TLS客户端身份验证,需要将节点配置中的属性 peer.tls.clientAuthRequired 设置为 true ,并将``peer.tls.clientRootCAs.files`` 属性设置为为客户端发布 TLS 证书 CA 证书链文件。

默认情况下,Peer 节点在充当 TLS 服务器和客户端时将使用相同的证书和私钥对。要在客户端使用其他证书和私钥对,请将 peer.tls.clientCert.filepeer.tls.clientKey.file 配置属性分别设置为客户端证书和密钥文件的标准路径。

也可以通过设置以下环境变量来启用具有客户端身份验证的 TLS:

  • CORE_PEER_TLS_ENABLED = true
  • CORE_PEER_TLS_CERT_FILE = 服务器证书的标准路径
  • CORE_PEER_TLS_KEY_FILE = 服务器私钥的标准路径
  • CORE_PEER_TLS_ROOTCERT_FILE = CA 证书链文件的标准路径
  • CORE_PEER_TLS_CLIENTAUTHREQUIRED = true
  • CORE_PEER_TLS_CLIENTROOTCAS_FILES = CA 证书链文件的标准路径
  • CORE_PEER_TLS_CLIENTCERT_FILE = 客户证书的标准路径
  • CORE_PEER_TLS_CLIENTKEY_FILE = 客户端密钥的标准路径

在 Peer 节点上启用客户端身份验证后,要求客户端在 TLS 握手期间发送其证书。如果客户端未发送其证书,则握手将失败,并且 Peer 节点将关闭连接。

当 Peer 节点加入通道时,将从通道的配置区块中读取通道成员的根 CA 的证书链,并将其添加到 TLS 客户端和服务端根 CA 的数据结构中。之后, Peer 节点间通信和 Peer 节点与排序节点间通信将会无缝地工作。

为排序节点配置 TLS

要在排序节点上启用 TLS,需要设置排序节点的配置:

  • General.TLS.Enabled = true
  • General.TLS.PrivateKey = 包含服务器私钥的文件的标准路径
  • General.TLS.Certificate = 包含服务器证书的文件的标准路径
  • General.TLS.RootCAs = 包含颁发 TLS 服务器证书 CA 证书链的标准路径

默认情况下,与 Peer 节点一样,排序节点上的 TLS 客户端身份验证处于关闭状态。要启用 TLS 客户端身份验证,需要设置以下配置属性:

  • General.TLS.ClientAuthRequired = true
  • General.TLS.ClientRootCAs = 包含颁发 TLS 服务器证书 CA 证书链的标准路径

也可以通过设置以下环境变量来启用具有客户端身份验证的 TLS :

  • ORDERER_GENERAL_TLS_ENABLED = true
  • ORDERER_GENERAL_TLS_PRIVATEKEY = 包含服务器私钥的文件的标准路径
  • ORDERER_GENERAL_TLS_CERTIFICATE = 包含服务器证书的文件的标准路径
  • ORDERER_GENERAL_TLS_ROOTCAS = 包含颁发 TLS 服务器证书 CA 证书链的标准路径
  • ORDERER_GENERAL_TLS_CLIENTAUTHREQUIRED = true
  • ORDERER_GENERAL_TLS_CLIENTROOTCAS = 包含颁发 TLS 服务器证书 CA 证书链的标准路径

为节点 CLI 配置 TLS

针对启用了 TLS 的 Peer 节点运行 CLI 命令时,必须设置以下环境变量:

  • CORE_PEER_TLS_ENABLED = true
  • CORE_PEER_TLS_ROOTCERT_FILE = 包含颁发 TLS 服务器证书 CA 证书链的标准路径

如果在远程服务器上也启用了 TLS 客户端身份验证,则除上述变量外,还必须设置以下变量:

  • CORE_PEER_TLS_CLIENTAUTHREQUIRED = true
  • CORE_PEER_TLS_CLIENTCERT_FILE = 客户端证书的标准路径
  • CORE_PEER_TLS_CLIENTKEY_FILE = 客户端私钥的标准路径

当运行连接到排序服务的命令时,例如 peer channel <create|update|fetch>peer chaincode <invoke>,如果在排序节点上启用了 TLS ,则还必须指定以下命令行参数:

  • –tls
  • –cafile <包含排序节点 CA 证书链的文件的标准路径>

如果在排序节点上启用了 TLS 客户端身份验证,则还必须指定以下参数:

  • –clientauth
  • –keyfile <包含客户端私钥的文件的标准路径>
  • –certfile <包含客户端证书的文件的标准路径>

调试 TLS 问题

在调试 TLS 问题之前,建议同时在 TLS 客户端和服务器端启用 GRPC debug 以获取附加信息。要启用 GRPC debug,需要在环境变量``FABRIC_LOGGING_SPEC`` 中加入 grpc=debug 。例如,如要将默认日志记录级别设置为 INFO,将 GRPC 日志记录级别设置为 DEBUG,则需先将日志记录规范设置为 grpc=debug:info

如果您在客户端看到错误消息 remote error: tls: bad certificate,则通常表示 TLS 服务器已启用客户端身份验证,并且该服务器未收到正确的客户端证书,或者收到了不信任的客户端证书。请确保客户端正在发送其证书,并且该证书已被 Peer 节点或排序节点信任的 CA 证书所签名。

如果在链码日志中看到错误消息 remote error: tls: bad certificate,请确保链码是使用 Fabric v1.1 或更高版本的程序构建的。