使用传输层安全性(TLS)确保安全通信

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

为peer节点配置TLS

peer节点既是TLS服务器,也是TLS客户端。当另一个peer节点、应用程序或CLI与它建立连接时是前者,当它与另一个peer节点或排序者建立连接时是后者。

要在peer节点上启用TLS,请设置以下peer节点配置属性:

  • 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配置属性``peer.tls.clientAuthRequired`` 为``true`` ,并设置``peer.tls.clientRootCAs.files``属性指向CA链文件,该文件包含为您组织的客户端颁发TLS证书的CA证书链。

默认情况下,peer节点在充当TLS服务器和客户端时将使用相同的证书和私钥对。要为客户端使用不同的证书和私钥对,请设置``peer.tls.clientCert.file`` 和``peer.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通信,peer对排序器通信应该无缝地工作。

为排序器节点配置TLS

要在排序器节点上启用TLS,请设置以下排序器配置属性:

  • General.TLS.Enabled = true

  • General.TLS.PrivateKey = 包含服务器私钥的文件的完全限定路径

  • General.TLS.Certificate = 包含服务器证书的文件的完全限定路径

  • General.TLS.RootCAs = 包含颁发TLS服务器证书的CA证书链的文件完全限定路径

默认情况下,TLS客户端身份验证在排序器上是关闭的,peer也是如此。要启用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证书链的文件完全限定路径

为peer CLI配置TLS

启用TLS的peer节点运行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|instantiate>,如果在排序器上启用了TLS,还必须指定以下命令行参数:

  • –tls

  • –cafile <fully qualified path of the file that contains cert chain of the orderer CA>

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

  • –clientauth

  • –keyfile <fully qualified path of the file that contains the client private key>

  • –certfile <fully qualified path of the file that contains the client certificate>

调试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或更新版本提供的链码shim构建的。如果您的链码不包含shim的vendored副本,那么删除链码容器并重新启动它的peer程序将使用当前shim版本重新构建链码容器。